diff --git a/docs/ar/ci.md b/docs/ar/ci.md index fdda656e6..707db8de4 100644 --- a/docs/ar/ci.md +++ b/docs/ar/ci.md @@ -1,75 +1,75 @@ --- read_when: - تحتاج إلى فهم سبب تشغيل مهمة CI أو عدم تشغيلها - - أنت بصدد تصحيح فشل في فحص GitHub Actions - - أنت تنسّق تشغيلًا للتحقق من الإصدار أو إعادة تشغيله -summary: رسم بياني لوظائف CI، وبوابات النطاق، ومظلات الإصدار، ومكافئات الأوامر المحلية + - أنت تصحح أخطاء فحص فاشل في GitHub Actions + - أنت تنسّق تشغيل عملية التحقق من صحة الإصدار أو إعادة تشغيلها +summary: مخطط مهام CI، وبوابات النطاق، ومظلات الإصدار، ومكافئات الأوامر المحلية title: مسار CI x-i18n: - generated_at: "2026-04-30T07:45:53Z" + generated_at: "2026-04-30T18:38:55Z" model: gpt-5.5 provider: openai - source_hash: a9c18f0801864ca1030aac9ea81117b011bd7936388984a1809ce3ae6e906e62 + source_hash: a24afc27606ac7f4e9ead89acdd319bffa23336610f8a6cd8b576ea1a5b233dd source_path: ci.md workflow: 16 --- -يدير OpenClaw CI على كل دفع إلى `main` وكل طلب سحب. تصنّف مهمة `preflight` الفروق وتوقف المسارات المكلفة عندما تتغير مناطق غير ذات صلة فقط. تتجاوز عمليات تشغيل `workflow_dispatch` اليدوية تحديد النطاق الذكي عمدًا وتوسّع الرسم البياني الكامل لمرشحي الإصدار والتحقق الواسع. تبقى مسارات Android اختيارية عبر `include_android`. تقع تغطية Plugin الخاصة بالإصدارات فقط في سير العمل المنفصل [`Plugin ما قبل الإصدار`](#plugin-prerelease)، ولا تعمل إلا من [`Full Release Validation`](#full-release-validation) أو من تشغيل يدوي صريح. +تشغّل منظومة CI الخاصة بـ OpenClaw عند كل دفع إلى `main` وكل طلب سحب. تصنّف مهمة `preflight` الفرق وتوقف المسارات المكلفة عندما تتغير مناطق غير مرتبطة فقط. تتجاوز عمليات التشغيل اليدوية عبر `workflow_dispatch` النطاق الذكي عمدًا وتوسّع التنفيذ إلى الرسم البياني الكامل لمرشحي الإصدار والتحقق الواسع. تبقى مسارات Android اختيارية عبر `include_android`. توجد تغطية Plugin الخاصة بالإصدار فقط في سير عمل [`Plugin Prerelease`](#plugin-prerelease) المنفصل، ولا تعمل إلا من [`Full Release Validation`](#full-release-validation) أو من تشغيل يدوي صريح. ## نظرة عامة على خط الأنابيب -| المهمة | الغرض | متى تعمل | +| المهمة | الغرض | متى تعمل | | -------------------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------- | -| `preflight` | اكتشاف تغييرات التوثيق فقط، والنطاقات المتغيرة، والامتدادات المتغيرة، وبناء بيان CI | دائمًا في عمليات الدفع وطلبات السحب غير المسودة | -| `security-scm-fast` | اكتشاف المفاتيح الخاصة وتدقيق سير العمل عبر `zizmor` | دائمًا في عمليات الدفع وطلبات السحب غير المسودة | -| `security-dependency-audit` | تدقيق ملف قفل الإنتاج دون اعتماديات مقابل تنبيهات npm | دائمًا في عمليات الدفع وطلبات السحب غير المسودة | -| `security-fast` | تجميع مطلوب لمهام الأمان السريعة | دائمًا في عمليات الدفع وطلبات السحب غير المسودة | -| `check-dependencies` | تمريرة Knip للإنتاج للاعتماديات فقط، مع حارس قائمة السماح للملفات غير المستخدمة | تغييرات ذات صلة بـ Node | -| `build-artifacts` | بناء `dist/`، وواجهة Control UI، وفحوصات الآثار المبنية، وآثار قابلة لإعادة الاستخدام لاحقًا | تغييرات ذات صلة بـ Node | -| `checks-fast-core` | مسارات صحة سريعة على Linux مثل فحوصات المضمن/عقد Plugin/البروتوكول | تغييرات ذات صلة بـ Node | -| `checks-fast-contracts-channels` | فحوصات عقود القنوات المقسمة إلى أجزاء مع نتيجة فحص تجميعية ثابتة | تغييرات ذات صلة بـ Node | -| `checks-node-core-test` | أجزاء اختبارات Node الأساسية، باستثناء مسارات القنوات والمضمن والعقود والامتدادات | تغييرات ذات صلة بـ Node | -| `check` | مكافئ البوابة المحلية الرئيسية المقسمة: أنواع الإنتاج، والLint، والحراس، وأنواع الاختبار، وفحص smoke صارم | تغييرات ذات صلة بـ Node | -| `check-additional` | أجزاء البنية، والحدود، وحراس سطح الامتدادات، وحدود الحزم، ومراقبة Gateway | تغييرات ذات صلة بـ Node | -| `build-smoke` | اختبارات smoke لـ CLI المبني وفحص smoke لذاكرة بدء التشغيل | تغييرات ذات صلة بـ Node | -| `checks` | متحقق لاختبارات قنوات الآثار المبنية | تغييرات ذات صلة بـ Node | -| `checks-node-compat-node22` | مسار بناء وتحقق smoke للتوافق مع Node 22 | تشغيل CI يدوي للإصدارات | -| `check-docs` | تنسيق التوثيق، والLint، وفحوصات الروابط المعطلة | عند تغير التوثيق | -| `skills-python` | Ruff + pytest لـ Skills المدعومة بـ Python | تغييرات ذات صلة بـ Skills في Python | -| `checks-windows` | اختبارات عمليات/مسارات خاصة بـ Windows إضافة إلى تراجعات محددات استيراد وقت التشغيل المشتركة | تغييرات ذات صلة بـ Windows | -| `macos-node` | مسار اختبار TypeScript على macOS باستخدام الآثار المبنية المشتركة | تغييرات ذات صلة بـ macOS | -| `macos-swift` | Swift lint والبناء والاختبارات لتطبيق macOS | تغييرات ذات صلة بـ macOS | -| `android` | اختبارات وحدة Android لكلتا النكهتين إضافة إلى بناء APK واحد للتصحيح | تغييرات ذات صلة بـ Android | -| `test-performance-agent` | تحسين يومي لاختبارات Codex البطيئة بعد نشاط موثوق | نجاح CI الرئيسي أو تشغيل يدوي | +| `preflight` | اكتشاف تغييرات التوثيق فقط، والنطاقات المتغيرة، وPluginات المتغيرة، وبناء بيان CI | دائمًا عند الدفعات وطلبات السحب غير المسودة | +| `security-scm-fast` | اكتشاف المفاتيح الخاصة وتدقيق سير العمل عبر `zizmor` | دائمًا عند الدفعات وطلبات السحب غير المسودة | +| `security-dependency-audit` | تدقيق ملف قفل الإنتاج من دون تبعيات مقابل تحذيرات npm | دائمًا عند الدفعات وطلبات السحب غير المسودة | +| `security-fast` | تجميع مطلوب لمهام الأمان السريعة | دائمًا عند الدفعات وطلبات السحب غير المسودة | +| `check-dependencies` | تمريرة Knip للإنتاج الخاصة بالتبعيات فقط، إضافة إلى حارس قائمة السماح للملفات غير المستخدمة | تغييرات ذات صلة بـ Node | +| `build-artifacts` | بناء `dist/`، وواجهة Control UI، وفحوصات القطع المبنية، والقطع القابلة لإعادة الاستخدام لاحقًا | تغييرات ذات صلة بـ Node | +| `checks-fast-core` | مسارات صحة Linux السريعة مثل فحوصات الحزم المضمّنة/عقد Plugin/البروتوكول | تغييرات ذات صلة بـ Node | +| `checks-fast-contracts-channels` | فحوصات عقود القنوات المقسمة إلى شظايا مع نتيجة تحقق تجميعية مستقرة | تغييرات ذات صلة بـ Node | +| `checks-node-core-test` | شظايا اختبارات Node الأساسية، باستثناء مسارات القنوات والحزم المضمّنة والعقود وPluginات | تغييرات ذات صلة بـ Node | +| `check` | مكافئ البوابة المحلية الرئيسية المقسمة إلى شظايا: أنواع الإنتاج، واللنت، والحراس، وأنواع الاختبارات، واختبار دخان صارم | تغييرات ذات صلة بـ Node | +| `check-additional` | شظايا البنية المعمارية، والحدود، وحراس سطح Plugin، وحدود الحزم، ومراقبة Gateway | تغييرات ذات صلة بـ Node | +| `build-smoke` | اختبارات دخان CLI المبني واختبار دخان ذاكرة بدء التشغيل | تغييرات ذات صلة بـ Node | +| `checks` | متحقق لاختبارات قناة القطع المبنية | تغييرات ذات صلة بـ Node | +| `checks-node-compat-node22` | مسار بناء ودخان للتوافق مع Node 22 | تشغيل CI يدوي للإصدارات | +| `check-docs` | فحوصات تنسيق التوثيق واللنت والروابط المعطلة | عند تغير التوثيق | +| `skills-python` | Ruff + pytest للـ Skills المدعومة بـ Python | تغييرات ذات صلة بـ Skills في Python | +| `checks-windows` | اختبارات عمليات/مسارات خاصة بـ Windows إضافة إلى تراجعات محددات استيراد وقت التشغيل المشتركة | تغييرات ذات صلة بـ Windows | +| `macos-node` | مسار اختبارات TypeScript على macOS باستخدام القطع المبنية المشتركة | تغييرات ذات صلة بـ macOS | +| `macos-swift` | Swift lint وبناء واختبارات لتطبيق macOS | تغييرات ذات صلة بـ macOS | +| `android` | اختبارات وحدة Android لكلا النكهتين إضافة إلى بناء APK تصحيحي واحد | تغييرات ذات صلة بـ Android | +| `test-performance-agent` | تحسين يومي لاختبارات Codex البطيئة بعد نشاط موثوق | نجاح CI على main أو تشغيل يدوي | ## ترتيب الفشل السريع -1. يقرر `preflight` أي المسارات موجودة أصلًا. منطق `docs-scope` و`changed-scope` خطوات داخل هذه المهمة، وليسا مهمتين مستقلتين. -2. تفشل `security-scm-fast` و`security-dependency-audit` و`security-fast` و`check` و`check-additional` و`check-docs` و`skills-python` بسرعة من دون انتظار مهام الآثار الأثقل ومصفوفة المنصات. -3. يتداخل `build-artifacts` مع مسارات Linux السريعة كي يتمكن المستهلكون اللاحقون من البدء فور جاهزية البناء المشترك. -4. تتوسع بعد ذلك مسارات المنصات ووقت التشغيل الأثقل: `checks-fast-core` و`checks-fast-contracts-channels` و`checks-node-core-test` و`checks` و`checks-windows` و`macos-node` و`macos-swift` و`android`. +1. يقرر `preflight` أي المسارات موجودة أصلًا. منطق `docs-scope` و`changed-scope` خطوات داخل هذه المهمة، وليس مهام مستقلة. +2. تفشل `security-scm-fast` و`security-dependency-audit` و`security-fast` و`check` و`check-additional` و`check-docs` و`skills-python` بسرعة من دون انتظار مهام القطع الأثقل ومصفوفة المنصات. +3. يتداخل `build-artifacts` مع مسارات Linux السريعة حتى يتمكن المستهلكون اللاحقون من البدء فور جاهزية البناء المشترك. +4. بعد ذلك تتوسع مسارات المنصات ووقت التشغيل الأثقل: `checks-fast-core` و`checks-fast-contracts-channels` و`checks-node-core-test` و`checks` و`checks-windows` و`macos-node` و`macos-swift` و`android`. -قد يعلّم GitHub المهام التي تجاوزها تشغيل أحدث على أنها `cancelled` عندما يصل دفع أحدث إلى طلب السحب نفسه أو مرجع `main`. تعامل مع ذلك كضجيج CI ما لم يكن أحدث تشغيل للمرجع نفسه يفشل أيضًا. تستخدم فحوصات الأجزاء التجميعية `!cancelled() && always()` بحيث تظل تبلغ عن إخفاقات الأجزاء العادية، لكنها لا تصطف بعد أن يكون سير العمل بأكمله قد تم تجاوزه بالفعل. مفتاح التزامن التلقائي لـ CI مُصدّر بإصدار (`CI-v7-*`) كي لا يستطيع تشغيل عالق من جهة GitHub في مجموعة صف قديمة حظر عمليات تشغيل main الأحدث إلى أجل غير مسمى. تستخدم عمليات تشغيل المجموعة الكاملة اليدوية `CI-manual-v1-*` ولا تلغي عمليات التشغيل الجارية. +قد يضع GitHub علامة `cancelled` على المهام التي تجاوزها تشغيل أحدث عندما تصل دفعة أحدث إلى طلب السحب نفسه أو مرجع `main`. تعامل مع ذلك كضوضاء CI ما لم يكن أحدث تشغيل للمرجع نفسه يفشل أيضًا. تستخدم فحوصات الشظايا التجميعية `!cancelled() && always()` حتى تظل تبلّغ عن إخفاقات الشظايا العادية، لكنها لا تصطف في الطابور بعد أن يكون سير العمل بأكمله قد تجاوزه تشغيل أحدث. مفتاح تزامن CI التلقائي مُرقّم بإصدار (`CI-v7-*`) حتى لا يتمكن عالق من جهة GitHub في مجموعة طابور قديمة من حظر تشغيلات main الأحدث إلى أجل غير مسمى. تستخدم تشغيلات المجموعة الكاملة اليدوية `CI-manual-v1-*` ولا تلغي التشغيلات الجارية. ## النطاق والتوجيه -يقع منطق النطاق في `scripts/ci-changed-scope.mjs` وتغطيه اختبارات وحدة في `src/scripts/ci-changed-scope.test.ts`. يتجاوز التشغيل اليدوي اكتشاف النطاق المتغير ويجعل بيان preflight يتصرف كما لو أن كل منطقة محددة النطاق قد تغيرت. +يوجد منطق النطاق في `scripts/ci-changed-scope.mjs` وتغطيه اختبارات وحدة في `src/scripts/ci-changed-scope.test.ts`. يتخطى التشغيل اليدوي اكتشاف النطاق المتغير ويجعل بيان preflight يتصرف كما لو أن كل منطقة ذات نطاق قد تغيرت. -- **تعديلات سير عمل CI** تتحقق من رسم CI البياني لـ Node إضافة إلى lint لسير العمل، لكنها لا تفرض وحدها بناءات Windows أو Android أو macOS الأصلية؛ تبقى مسارات المنصات هذه محددة بتغييرات مصادر المنصة. -- **تعديلات توجيه CI فقط، وتعديلات تجهيزات اختبارات core رخيصة مختارة، وتعديلات مساعد/اختبار توجيه ضيقة لعقد Plugin** تستخدم مسار بيان سريع خاص بـ Node فقط: `preflight`، والأمان، ومهمة `checks-fast-core` واحدة. يتجاوز ذلك المسار آثار البناء، وتوافق Node 22، وعقود القنوات، وأجزاء core الكاملة، وأجزاء Plugin المضمنة، ومصفوفات الحراس الإضافية عندما يكون التغيير محدودًا بأسطح التوجيه أو المساعد التي تمارسها المهمة السريعة مباشرة. -- **فحوصات Node على Windows** محددة بمغلفات العمليات/المسارات الخاصة بـ Windows، ومساعدات مشغّل npm/pnpm/UI، وإعداد مدير الحزم، وأسطح سير عمل CI التي تنفذ ذلك المسار؛ تبقى تغييرات المصدر وPlugin وinstall-smoke والاختبارات فقط غير ذات الصلة على مسارات Linux Node. +- **تعديلات سير عمل CI** تتحقق من رسم CI الخاص بـ Node إضافة إلى لنت سير العمل، لكنها لا تفرض عمليات بناء Windows أو Android أو macOS الأصلية بذاتها؛ تبقى مسارات هذه المنصات محصورة في تغييرات مصدر المنصة. +- **تعديلات توجيه CI فقط، وتعديلات مختارة لرُزم اختبارات أساسية رخيصة، وتعديلات ضيقة على مساعدي/توجيه اختبارات عقد Plugin** تستخدم مسار بيان سريعًا خاصًا بـ Node فقط: `preflight`، والأمان، ومهمة `checks-fast-core` واحدة. يتخطى ذلك المسار قطع البناء، وتوافق Node 22، وعقود القنوات، وشظايا الأساس الكاملة، وشظايا Pluginات المضمّنة، ومصفوفات الحراس الإضافية عندما يقتصر التغيير على أسطح التوجيه أو المساعدة التي تختبرها المهمة السريعة مباشرة. +- **فحوصات Windows Node** محصورة في مغلفات العمليات/المسارات الخاصة بـ Windows، ومساعدي npm/pnpm/UI runner، وتكوين مدير الحزم، وأسطح سير عمل CI التي تنفذ ذلك المسار؛ تبقى تغييرات المصدر غير المرتبطة، وPlugin، ودخان التثبيت، وتغييرات الاختبارات فقط على مسارات Linux Node. -تُقسّم أو تُوازن أبطأ عائلات اختبارات Node بحيث تبقى كل مهمة صغيرة دون حجز زائد للمشغلات: تعمل عقود القنوات كثلاثة أجزاء موزونة، وتُقرن مسارات وحدات core الصغيرة، ويعمل auto-reply بأربعة عمال متوازنين (مع تقسيم الشجرة الفرعية للرد إلى أجزاء agent-runner وdispatch وcommands/state-routing)، وتُوزع إعدادات Gateway/Plugin الوكيلية عبر مهام Node الوكيلية القائمة الخاصة بالمصدر فقط بدل الانتظار على الآثار المبنية. تستخدم اختبارات المتصفح وQA والوسائط وPlugin المتنوعة الواسعة إعدادات Vitest المخصصة لها بدل مجمّع Plugin المشترك. تسجل أجزاء أنماط التضمين إدخالات التوقيت باستخدام اسم جزء CI، بحيث يمكن لـ `.artifacts/vitest-shard-timings.json` التمييز بين إعداد كامل وجزء مرشح. يُبقي `check-additional` عمل تجميع/Canary حدود الحزم معًا، ويفصل بنية طوبولوجيا وقت التشغيل عن تغطية مراقبة Gateway؛ ويشغّل جزء حارس الحدود حراسه الصغيرة المستقلة بالتوازي داخل مهمة واحدة. تعمل مراقبة Gateway، واختبارات القنوات، وجزء حدود دعم core بالتوازي داخل `build-artifacts` بعد بناء `dist/` و`dist-runtime/` بالفعل. +تُقسّم أو تُوازن أبطأ عائلات اختبارات Node حتى تبقى كل مهمة صغيرة من دون حجز زائد للمشغلات: تعمل عقود القنوات كثلاث شظايا موزونة، وتُقرن مسارات الوحدات الأساسية الصغيرة، ويعمل الرد التلقائي كأربعة عمّال متوازنين (مع تقسيم شجرة الرد الفرعية إلى شظايا agent-runner وdispatch وcommands/state-routing)، وتُوزع تكوينات Gateway/Plugin الوكيلة عبر مهام Node الوكيلة الحالية الخاصة بالمصدر فقط بدلًا من انتظار القطع المبنية. تستخدم اختبارات المتصفح الواسعة، وQA، والوسائط، واختبارات Plugin المتنوعة تكوينات Vitest المخصصة لها بدلًا من مجمع Plugin المشترك العام. تسجل شظايا أنماط التضمين إدخالات توقيت باستخدام اسم شظية CI، حتى يستطيع `.artifacts/vitest-shard-timings.json` التمييز بين تكوين كامل وشظية مفلترة. يبقي `check-additional` عمل ترجمة/تجربة حدود الحزم معًا، ويفصل بنية طوبولوجيا وقت التشغيل عن تغطية مراقبة Gateway؛ تشغّل شظية حارس الحدود حراسها المستقلين الصغار بالتوازي داخل مهمة واحدة. تعمل مراقبة Gateway، واختبارات القنوات، وشظية حدود دعم الأساس بالتوازي داخل `build-artifacts` بعد أن يكون `dist/` و`dist-runtime/` قد بُنيا بالفعل. -يشغّل Android CI كلًا من `testPlayDebugUnitTest` و`testThirdPartyDebugUnitTest` ثم يبني Play debug APK. لا تملك نكهة الطرف الثالث مجموعة مصادر أو بيانًا منفصلًا؛ ما زال مسار اختبارات الوحدة الخاص بها يترجم النكهة مع أعلام BuildConfig الخاصة بـ SMS/call-log، مع تجنب مهمة تغليف debug APK مكررة في كل دفع ذي صلة بـ Android. +تشغّل CI الخاصة بـ Android كلًا من `testPlayDebugUnitTest` و`testThirdPartyDebugUnitTest` ثم تبني APK التصحيحي لنكهة Play. لا تملك نكهة الطرف الثالث مجموعة مصدر أو بيانًا منفصلًا؛ ما زال مسار اختبارات الوحدة الخاص بها يترجم النكهة مع أعلام BuildConfig الخاصة بـ SMS/سجل المكالمات، مع تجنب مهمة تغليف APK تصحيحي مكررة عند كل دفعة ذات صلة بـ Android. -يشغّل جزء `check-dependencies` الأمر `pnpm deadcode:dependencies` (تمريرة Knip للإنتاج للاعتماديات فقط مثبتة على أحدث إصدار Knip، مع تعطيل الحد الأدنى لعمر إصدار pnpm لتثبيت `dlx`) و`pnpm deadcode:unused-files`، الذي يقارن نتائج Knip لملفات الإنتاج غير المستخدمة مع `scripts/deadcode-unused-files.allowlist.mjs`. يفشل حارس الملفات غير المستخدمة عندما يضيف طلب سحب ملفًا جديدًا غير مستخدم وغير مراجع، أو يترك إدخال قائمة سماح قديمًا، مع الحفاظ على أسطح Plugin الديناميكية المقصودة، والمولدة، والبناء، والاختبارات الحية، وجسور الحزم التي لا يستطيع Knip حلها ساكنًا. +تشغّل شظية `check-dependencies` الأمر `pnpm deadcode:dependencies` (تمريرة Knip إنتاجية خاصة بالتبعيات فقط ومثبتة على أحدث إصدار من Knip، مع تعطيل حد العمر الأدنى لإصدار pnpm لتثبيت `dlx`) و`pnpm deadcode:unused-files`، الذي يقارن نتائج Knip الإنتاجية للملفات غير المستخدمة مع `scripts/deadcode-unused-files.allowlist.mjs`. يفشل حارس الملفات غير المستخدمة عندما يضيف طلب سحب ملفًا جديدًا غير مستخدم ولم يُراجع، أو يترك إدخالًا قديمًا في قائمة السماح، مع الحفاظ على أسطح Plugin الديناميكية المقصودة، والمولدة، والبناء، والاختبارات الحية، وجسور الحزم التي لا يستطيع Knip حلّها ساكنًا. -## عمليات التشغيل اليدوية +## التشغيلات اليدوية -تشغّل عمليات CI اليدوية الرسم البياني نفسه للمهام مثل CI العادي، لكنها تفرض تشغيل كل مسار محدد النطاق غير Android: أجزاء Linux Node، وأجزاء Plugin المضمنة، وعقود القنوات، وتوافق Node 22، و`check`، و`check-additional`، وbuild smoke، وفحوصات التوثيق، وSkills في Python، وWindows، وmacOS، وControl UI i18n. تشغّل عمليات CI اليدوية المستقلة Android فقط مع `include_android=true`؛ وتمكّن مظلة الإصدار الكاملة Android بتمرير `include_android=true`. تُستثنى فحوصات Plugin الثابتة لما قبل الإصدار، وجزء `agentic-plugins` الخاص بالإصدار فقط، والمسح الدفعي الكامل للامتدادات، ومسارات Docker لما قبل إصدار Plugin من CI. لا تعمل مجموعة Docker لما قبل الإصدار إلا عندما يشغّل `Full Release Validation` سير عمل `Plugin Prerelease` المنفصل مع تمكين بوابة تحقق الإصدار. +تشغّل عمليات CI اليدوية الرسم البياني نفسه للمهام مثل CI العادية، لكنها تفرض تشغيل كل مسار ذي نطاق غير Android: شظايا Linux Node، وشظايا Plugin المضمّنة، وعقود القنوات، وتوافق Node 22، و`check`، و`check-additional`، ودخان البناء، وفحوصات التوثيق، وSkills في Python، وWindows، وmacOS، وi18n لواجهة Control UI. تشغّل عمليات CI اليدوية المستقلة Android فقط مع `include_android=true`؛ وتفعّل مظلة الإصدار الكاملة Android بتمرير `include_android=true`. تُستبعد فحوصات Plugin prerelease الساكنة، وشظية `agentic-plugins` الخاصة بالإصدار فقط، ومسح دفعات Plugin الكامل، ومسارات Docker الخاصة بـ Plugin prerelease من CI. لا تعمل حزمة Docker prerelease إلا عندما يشغّل `Full Release Validation` سير عمل `Plugin Prerelease` المنفصل مع تمكين بوابة التحقق من الإصدار. -تستخدم عمليات التشغيل اليدوية مجموعة تزامن فريدة بحيث لا تلغي دفعة أخرى أو تشغيل طلب سحب على المرجع نفسه مجموعة كاملة لمرشح إصدار. يتيح إدخال `target_ref` الاختياري لمستدع موثوق تشغيل ذلك الرسم البياني على فرع أو وسم أو SHA كامل للالتزام مع استخدام ملف سير العمل من مرجع التشغيل المحدد. +تستخدم التشغيلات اليدوية مجموعة تزامن فريدة حتى لا تُلغى المجموعة الكاملة لمرشح إصدار بواسطة دفعة أو تشغيل طلب سحب آخر على المرجع نفسه. يتيح إدخال `target_ref` الاختياري لمستدعٍ موثوق تشغيل ذلك الرسم البياني ضد فرع أو وسم أو SHA كامل للالتزام مع استخدام ملف سير العمل من مرجع التشغيل المحدد. ```bash gh workflow run ci.yml --ref release/YYYY.M.D @@ -79,15 +79,15 @@ gh workflow run full-release-validation.yml --ref main -f ref= ## المشغلات -| المشغّل | المهام | +| المُشغّل | المهام | | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ubuntu-24.04` | `preflight`، ومهام الأمان السريعة والتجميعات (`security-scm-fast`، `security-dependency-audit`، `security-fast`)، وفحوصات البروتوكول/العقد/المضمّنة السريعة، وفحوصات عقود القنوات المقسّمة، وأجزاء `check` باستثناء الفحص اللمطي، وأجزاء `check-additional` وتجميعاتها، ومحقّقات تجميع اختبارات Node، وفحوصات التوثيق، وSkills الخاصة بـ Python، وworkflow-sanity، وlabeler، وauto-response؛ يستخدم تمهيد install-smoke أيضا Ubuntu المستضاف على GitHub لكي تتمكن مصفوفة Blacksmith من الاصطفاف مبكرا | -| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`، وأجزاء Plugin الأخف وزنا، و`checks-fast-core`، و`checks-node-compat-node22`، و`check-prod-types`، و`check-test-types` | -| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`، وbuild-smoke، وأجزاء اختبار Linux Node، وأجزاء اختبار Plugin المضمّنة، و`android` | -| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (حساس بما يكفي لاستهلاك CPU بحيث كلفت 8 vCPU أكثر مما وفرت)؛ وبنى Docker الخاصة بـ install-smoke (كلف وقت صف 32-vCPU أكثر مما وفر) | +| `ubuntu-24.04` | `preflight`، ومهام الأمان السريعة والتجميعات (`security-scm-fast`، `security-dependency-audit`، `security-fast`)، وفحوصات البروتوكول/العقد/المضمّنة السريعة، وفحوصات عقود القنوات الموزعة، وشظايا `check` باستثناء lint، وشظايا `check-additional` وتجميعاتها، ومحققات تجميع اختبارات Node، وفحوصات الوثائق، وSkills الخاصة بـ Python، وworkflow-sanity، وlabeler، وauto-response؛ كما يستخدم تمهيد install-smoke Ubuntu المستضاف على GitHub بحيث يمكن لمصفوفة Blacksmith الاصطفاف أبكر | +| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`، وشظايا Plugin الأقل وزنًا، و`checks-fast-core`، و`checks-node-compat-node22`، و`check-prod-types`، و`check-test-types` | +| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`، وbuild-smoke، وشظايا اختبارات Linux Node، وشظايا اختبارات Plugin المضمّنة، و`android` | +| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (حساس للمعالج بما يكفي لأن 8 vCPU كلفت أكثر مما وفرت)؛ وبناءات Docker الخاصة بـ install-smoke (وقت الاصطفاف لـ 32-vCPU كلف أكثر مما وفر) | | `blacksmith-16vcpu-windows-2025` | `checks-windows` | -| `blacksmith-6vcpu-macos-latest` | `macos-node` على `openclaw/openclaw`؛ تعود التفريعات إلى `macos-latest` | -| `blacksmith-12vcpu-macos-latest` | `macos-swift` على `openclaw/openclaw`؛ تعود التفريعات إلى `macos-latest` | +| `blacksmith-6vcpu-macos-latest` | `macos-node` على `openclaw/openclaw`؛ تعود الفروع المتشعبة إلى `macos-latest` | +| `blacksmith-12vcpu-macos-latest` | `macos-swift` على `openclaw/openclaw`؛ تعود الفروع المتشعبة إلى `macos-latest` | ## المكافئات المحلية @@ -117,27 +117,27 @@ pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifac ## التحقق الكامل من الإصدار -`Full Release Validation` هو سير العمل اليدوي الجامع لـ "تشغيل كل شيء قبل الإصدار." يقبل فرعا أو وسما أو SHA كاملا للالتزام، ويشغّل سير عمل `CI` اليدوي بذلك الهدف، ويشغّل `Plugin Prerelease` لإثباتات Plugin/package/static/Docker الخاصة بالإصدار فقط، ويشغّل `OpenClaw Release Checks` لفحص التثبيت، وقبول الحزمة، ومجموعات مسار إصدار Docker، والاختبارات الحية/E2E، وOpenWebUI، وتكافؤ QA Lab، وMatrix، ومسارات Telegram. يمكنه أيضا تشغيل سير عمل `NPM Telegram Beta E2E` بعد النشر عند توفير مواصفة حزمة منشورة. +`Full Release Validation` هو سير العمل اليدوي الجامع من أجل "تشغيل كل شيء قبل الإصدار". يقبل فرعًا أو وسمًا أو SHA كاملًا للالتزام، ويشغّل سير العمل اليدوي `CI` بذلك الهدف، ويشغّل `Plugin Prerelease` لإثباتات Plugin/الحزمة/الثابت/Docker الخاصة بالإصدار فقط، ويشغّل `OpenClaw Release Checks` لاختبار التثبيت، وقبول الحزمة، ومجموعات مسار إصدار Docker، والاختبارات الحية/E2E، وOpenWebUI، وتكافؤ QA Lab، وMatrix، ومسارات Telegram. ويمكنه أيضًا تشغيل سير العمل اللاحق للنشر `NPM Telegram Beta E2E` عند توفير مواصفة حزمة منشورة. -يتحكم `release_profile` في نطاق التغطية الحية/المزوّدين الممرر إلى فحوصات الإصدار: +يتحكم `release_profile` في اتساع النطاق الحي/المزود الممرر إلى فحوصات الإصدار: -- يحافظ `minimum` على أسرع مسارات OpenAI/core الحرجة للإصدار. -- يضيف `stable` مجموعة المزوّدين/الخلفيات المستقرة. -- يشغّل `full` مصفوفة المزوّدين/الوسائط الاستشارية الواسعة. +- يحافظ `minimum` على أسرع مسارات OpenAI/النواة الحرجة للإصدار. +- يضيف `stable` مجموعة المزود/الخلفية المستقرة. +- يشغّل `full` مصفوفة المزود/الوسائط الاستشارية الواسعة. -يسجل سير العمل الجامع معرّفات تشغيل الأبناء التي تم تشغيلها، وتعيد مهمة `Verify full validation` النهائية فحص استنتاجات تشغيل الأبناء الحالية وتلحق جداول أبطأ المهام لكل تشغيل ابن. إذا أعيد تشغيل سير عمل ابن وتحول إلى أخضر، فأعد تشغيل مهمة التحقق الأب فقط لتحديث نتيجة سير العمل الجامع وملخص التوقيت. +يسجل سير العمل الجامع معرّفات تشغيل سلاسل العمل الفرعية التي شغّلها، وتعيد مهمة `Verify full validation` النهائية فحص الاستنتاجات الحالية لتشغيلات الأبناء وتلحق جداول أبطأ المهام لكل تشغيل ابن. إذا أُعيد تشغيل سير عمل فرعي وتحول إلى أخضر، فأعد تشغيل مهمة تحقق الأصل فقط لتحديث نتيجة المظلة وملخص التوقيت. -للاسترداد، يقبل كل من `Full Release Validation` و`OpenClaw Release Checks` قيمة `rerun_group`. استخدم `all` لمرشح إصدار، و`ci` للابن العادي الخاص بـ CI الكامل فقط، و`release-checks` لكل ابن إصدار، أو مجموعة أضيق: `install-smoke`، أو `cross-os`، أو `live-e2e`، أو `package`، أو `qa`، أو `qa-parity`، أو `qa-live`، أو `npm-telegram` على سير العمل الجامع. يبقي هذا إعادة تشغيل صندوق إصدار فاشل محدودة بعد إصلاح مركز. +للاسترداد، يقبل كل من `Full Release Validation` و`OpenClaw Release Checks` القيمة `rerun_group`. استخدم `all` لمرشح إصدار، و`ci` لابن CI الكامل العادي فقط، و`release-checks` لكل ابن إصدار، أو مجموعة أضيق: `install-smoke`، أو `cross-os`، أو `live-e2e`، أو `package`، أو `qa`، أو `qa-parity`، أو `qa-live`، أو `npm-telegram` على سير العمل الجامع. وهذا يبقي إعادة تشغيل صندوق إصدار فاشل محدودة بعد إصلاح مركز. -تستخدم `OpenClaw Release Checks` مرجع سير العمل الموثوق لحل المرجع المحدد مرة واحدة إلى أرشيف `release-package-under-test`، ثم تمرر ذلك الأثر إلى كل من سير عمل Docker لمسار الإصدار الحي/E2E وجزء قبول الحزمة. يحافظ ذلك على اتساق بايتات الحزمة عبر صناديق الإصدار ويتجنب إعادة تغليف المرشح نفسه في عدة مهام أبناء. +يستخدم `OpenClaw Release Checks` مرجع سير العمل الموثوق لحل المرجع المحدد مرة واحدة إلى أرشيف `release-package-under-test`، ثم يمرر ذلك الأثر إلى كل من سير عمل Docker لمسار الإصدار الحي/E2E وشظية قبول الحزمة. هذا يبقي بايتات الحزمة متسقة عبر صناديق الإصدار ويتجنب إعادة حزم المرشح نفسه في عدة مهام فرعية. -## الأجزاء الحية وأجزاء E2E +## الشظايا الحية وE2E -يحافظ ابن الإصدار الحي/E2E على تغطية `pnpm test:live` الأصلية الواسعة، لكنه يشغلها كأجزاء مسماة عبر `scripts/test-live-shard.mjs` بدلا من مهمة تسلسلية واحدة: +يبقي ابن الإصدار الحي/E2E تغطية `pnpm test:live` الأصلية الواسعة، لكنه يشغلها كشظايا مسماة عبر `scripts/test-live-shard.mjs` بدلًا من مهمة تسلسلية واحدة: - `native-live-src-agents` - `native-live-src-gateway-core` -- مهام `native-live-src-gateway-profiles` المفلترة حسب المزوّد +- مهام `native-live-src-gateway-profiles` المفلترة حسب المزود - `native-live-src-gateway-backends` - `native-live-test` - `native-live-extensions-a-k` @@ -145,57 +145,57 @@ pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifac - `native-live-extensions-openai` - `native-live-extensions-o-z-other` - `native-live-extensions-xai` -- أجزاء الصوت/الفيديو للوسائط المقسمة وأجزاء الموسيقى المفلترة حسب المزوّد +- شظايا الصوت/الفيديو المقسمة وشظايا الموسيقى المفلترة حسب المزود -يحافظ ذلك على تغطية الملفات نفسها مع تسهيل إعادة تشغيل وتشخيص أعطال المزوّدين الحية البطيئة. تظل أسماء أجزاء التجميع `native-live-extensions-o-z`، و`native-live-extensions-media`، و`native-live-extensions-media-music` صالحة لإعادات التشغيل اليدوية لمرة واحدة. +هذا يحافظ على تغطية الملفات نفسها مع جعل إخفاقات المزود الحي البطيئة أسهل في إعادة التشغيل والتشخيص. وتبقى أسماء الشظايا التجميعية `native-live-extensions-o-z` و`native-live-extensions-media` و`native-live-extensions-media-music` صالحة لإعادات التشغيل اليدوية ذات المحاولة الواحدة. -تعمل أجزاء الوسائط الحية الأصلية في `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`، المبني بواسطة سير عمل `Live Media Runner Image`. تثبّت تلك الصورة `ffmpeg` و`ffprobe` مسبقا؛ تتحقق مهام الوسائط من الثنائيات فقط قبل الإعداد. أبق مجموعات الاختبار الحية المدعومة بـ Docker على مشغّلات Blacksmith العادية، فمهام الحاويات ليست المكان الصحيح لتشغيل اختبارات Docker متداخلة. +تعمل شظايا الوسائط الحية الأصلية في `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`، المبنية بواسطة سير عمل `Live Media Runner Image`. تثبت تلك الصورة مسبقًا `ffmpeg` و`ffprobe`؛ وتتحقق مهام الوسائط من الثنائيات فقط قبل الإعداد. أبقِ مجموعات الاختبارات الحية المدعومة بـ Docker على مشغّلات Blacksmith العادية — فمهام الحاويات ليست المكان المناسب لإطلاق اختبارات Docker المتداخلة. -تستخدم أجزاء النموذج/الخلفية الحية المدعومة بـ Docker صورة مشتركة منفصلة `ghcr.io/openclaw/openclaw-live-test:` لكل التزام محدد. يبني سير عمل الإصدار الحي تلك الصورة ويدفعها مرة واحدة، ثم تعمل أجزاء نموذج Docker الحي وGateway وخلفية CLI وربط ACP وحزمة Codex مع `OPENCLAW_SKIP_DOCKER_BUILD=1`. إذا أعادت تلك الأجزاء بناء هدف Docker الكامل من المصدر بشكل مستقل، فإعداد تشغيل الإصدار خاطئ وسيهدر وقتا فعليا على بنى صور مكررة. +تستخدم شظايا النموذج/الخلفية الحية المدعومة بـ Docker صورة مشتركة منفصلة `ghcr.io/openclaw/openclaw-live-test:` لكل التزام محدد. يبني سير عمل الإصدار الحي تلك الصورة ويدفعها مرة واحدة، ثم تعمل شظايا نموذج Docker الحي، وGateway، وخلفية CLI، وربط ACP، وحزمة Codex مع `OPENCLAW_SKIP_DOCKER_BUILD=1`. إذا أعادت تلك الشظايا بناء هدف Docker الكامل للمصدر بشكل مستقل، فهذا يعني أن تشغيل الإصدار مهيأ بشكل خاطئ وسيهدر وقتًا فعليًا على بناءات صور مكررة. ## قبول الحزمة -استخدم `Package Acceptance` عندما يكون السؤال هو "هل تعمل حزمة OpenClaw القابلة للتثبيت هذه كمنتج؟" يختلف ذلك عن CI العادي: يتحقق CI العادي من شجرة المصدر، بينما يتحقق قبول الحزمة من أرشيف tarball واحد عبر حزمة Docker E2E نفسها التي يستخدمها المستخدمون بعد التثبيت أو التحديث. +استخدم `Package Acceptance` عندما يكون السؤال هو "هل تعمل حزمة OpenClaw القابلة للتثبيت هذه كمنتج؟" وهو يختلف عن CI العادي: يتحقق CI العادي من شجرة المصدر، بينما يتحقق قبول الحزمة من أرشيف tarball واحد عبر حزمة Docker E2E نفسها التي يستخدمها المستخدمون بعد التثبيت أو التحديث. ### المهام -1. يسحب `resolve_package` ‏`workflow_ref`، ويحل مرشح حزمة واحدا، ويكتب `.artifacts/docker-e2e-package/openclaw-current.tgz`، ويكتب `.artifacts/docker-e2e-package/package-candidate.json`، ويرفع كليهما كأثر `package-under-test`، ويطبع المصدر ومرجع سير العمل ومرجع الحزمة والإصدار وSHA-256 والملف الشخصي في ملخص خطوة GitHub. -2. يستدعي `docker_acceptance` ‏`openclaw-live-and-e2e-checks-reusable.yml` مع `ref=workflow_ref` و`package_artifact_name=package-under-test`. ينزّل سير العمل القابل لإعادة الاستخدام ذلك الأثر، ويتحقق من مخزون tarball، ويحضّر صور Docker الخاصة بملخص الحزمة عند الحاجة، ويشغّل مسارات Docker المحددة ضد تلك الحزمة بدلا من تغليف نسخة سير العمل المسحوبة. عندما يحدد ملف شخصي عدة `docker_lanes` موجهة، يجهز سير العمل القابل لإعادة الاستخدام الحزمة والصور المشتركة مرة واحدة، ثم يوزع تلك المسارات كمهام Docker موجهة متوازية مع آثار فريدة. -3. يستدعي `package_telegram` اختياريا `NPM Telegram Beta E2E`. يعمل عندما لا يكون `telegram_mode` هو `none` ويثبت أثر `package-under-test` نفسه عندما يكون Package Acceptance قد حل واحدا؛ ولا يزال بإمكان تشغيل Telegram مستقل تثبيت مواصفة npm منشورة. -4. تفشل `summary` سير العمل إذا فشل حل الحزمة، أو قبول Docker، أو مسار Telegram الاختياري. +1. يتحقق `resolve_package` من `workflow_ref`، ويحل مرشح حزمة واحدًا، ويكتب `.artifacts/docker-e2e-package/openclaw-current.tgz`، ويكتب `.artifacts/docker-e2e-package/package-candidate.json`، ويرفع كليهما كأثر `package-under-test`، ويطبع المصدر، ومرجع سير العمل، ومرجع الحزمة، والإصدار، وSHA-256، والملف الشخصي في ملخص خطوة GitHub. +2. يستدعي `docker_acceptance` الملف `openclaw-live-and-e2e-checks-reusable.yml` مع `ref=workflow_ref` و`package_artifact_name=package-under-test`. ينزل سير العمل القابل لإعادة الاستخدام ذلك الأثر، ويتحقق من جرد أرشيف tarball، ويجهز صور Docker الخاصة بملخص الحزمة عند الحاجة، ويشغل مسارات Docker المحددة ضد تلك الحزمة بدلًا من حزم نسخة سير العمل. عندما يحدد ملف شخصي عدة `docker_lanes` مستهدفة، يجهز سير العمل القابل لإعادة الاستخدام الحزمة والصور المشتركة مرة واحدة، ثم يوزع تلك المسارات كمهام Docker مستهدفة متوازية ذات آثار فريدة. +3. يستدعي `package_telegram` اختياريًا `NPM Telegram Beta E2E`. يعمل عندما لا يكون `telegram_mode` هو `none` ويثبت أثر `package-under-test` نفسه عندما يكون قبول الحزمة قد حله؛ ولا يزال بإمكان تشغيل Telegram المستقل تثبيت مواصفة npm منشورة. +4. يفشل `summary` سير العمل إذا فشل حل الحزمة، أو قبول Docker، أو مسار Telegram الاختياري. ### مصادر المرشحين - يقبل `source=npm` فقط `openclaw@beta` أو `openclaw@latest` أو إصدار OpenClaw دقيقًا مثل `openclaw@2026.4.27-beta.2`. استخدم هذا لقبول الإصدارات التجريبية/المستقرة المنشورة. -- يحزم `source=ref` فرعًا أو وسمًا أو SHA كاملًا موثوقًا من `package_ref`. يجلب المحلل فروع/وسوم OpenClaw، ويتحقق من أن الالتزام المحدد يمكن الوصول إليه من سجل فرع المستودع أو وسم إصدار، ويثبّت الاعتماديات في شجرة عمل منفصلة، ويحزمه باستخدام `scripts/package-openclaw-for-docker.mjs`. -- يحمّل `source=url` ملف HTTPS بامتداد `.tgz`؛ يكون `package_sha256` مطلوبًا. -- يحمّل `source=artifact` ملف `.tgz` واحدًا من `artifact_run_id` و`artifact_name`؛ يكون `package_sha256` اختياريًا لكن ينبغي توفيره للآثار المشتركة خارجيًا. +- يحزم `source=ref` فرعًا أو وسمًا أو SHA كاملًا لالتزام `package_ref` موثوق. يجلب المحلّل فروع/وسوم OpenClaw، ويتحقق من أن الالتزام المحدد قابل للوصول من سجل فرع المستودع أو وسم إصدار، ثم يثبّت الاعتماديات في شجرة عمل منفصلة، ويحزمه باستخدام `scripts/package-openclaw-for-docker.mjs`. +- ينزّل `source=url` ملف `.tgz` عبر HTTPS؛ يكون `package_sha256` مطلوبًا. +- ينزّل `source=artifact` ملف `.tgz` واحدًا من `artifact_run_id` و`artifact_name`؛ يكون `package_sha256` اختياريًا، لكن ينبغي توفيره للقطع الأثرية المشتركة خارجيًا. -أبقِ `workflow_ref` و`package_ref` منفصلين. `workflow_ref` هو كود سير العمل/عدة الاختبار الموثوق الذي يشغّل الاختبار. `package_ref` هو التزام المصدر الذي يُحزم عندما يكون `source=ref`. يتيح هذا لعدة الاختبار الحالية التحقق من التزامات مصدر موثوقة أقدم دون تشغيل منطق سير عمل قديم. +أبقِ `workflow_ref` و`package_ref` منفصلين. `workflow_ref` هو كود سير العمل/الحاضنة الموثوق الذي يشغّل الاختبار. `package_ref` هو التزام المصدر الذي يُحزّم عندما تكون القيمة `source=ref`. يتيح هذا لحاضنة الاختبار الحالية التحقق من التزامات مصدر موثوقة أقدم دون تشغيل منطق سير عمل قديم. -### ملفات تعريف المجموعة +### ملفات تعريف الحزمة - `smoke` — `npm-onboard-channel-agent`, `gateway-network`, `config-reload` -- `package` — `npm-onboard-channel-agent`, `doctor-switch`, `update-channel-switch`, `bundled-channel-deps-compat`, `plugins-offline`, `plugin-update` +- `package` — `npm-onboard-channel-agent`, `doctor-switch`, `update-channel-switch`, `upgrade-survivor`, `bundled-channel-deps-compat`, `plugins-offline`, `plugin-update` - `product` — `package` بالإضافة إلى `mcp-channels`, `cron-mcp-cleanup`, `openai-web-search-minimal`, `openwebui` - `full` — أجزاء مسار إصدار Docker الكاملة مع OpenWebUI -- `custom` — `docker_lanes` الدقيقة؛ مطلوبة عندما يكون `suite_profile=custom` +- `custom` — `docker_lanes` الدقيقة؛ مطلوبة عندما تكون `suite_profile=custom` -يستخدم ملف تعريف `package` تغطية Plugin بلا اتصال حتى لا يعتمد التحقق من الحزمة المنشورة على إتاحة ClawHub المباشرة. يعيد مسار Telegram الاختياري استخدام أثر `package-under-test` في `NPM Telegram Beta E2E`، مع إبقاء مسار مواصفة npm المنشورة للإرسال المستقل. +يستخدم ملف تعريف `package` تغطية Plugin دون اتصال كي لا يكون التحقق من الحزمة المنشورة مشروطًا بتوافر ClawHub المباشر. يعيد مسار Telegram الاختياري استخدام قطعة `package-under-test` في `NPM Telegram Beta E2E`، مع إبقاء مسار مواصفة npm المنشورة لعمليات التشغيل المستقلة. -تستدعي فحوصات الإصدار Package Acceptance باستخدام `source=ref` و`package_ref=` و`workflow_ref=` و`suite_profile=custom` و`docker_lanes='bundled-channel-deps-compat plugins-offline'` و`telegram_mode=mock-openai`. تغطي أجزاء Docker لمسار الإصدار مسارات الحزمة/التحديث/Plugin المتداخلة؛ ويحافظ Package Acceptance على إثبات توافق القنوات المضمّنة الأصلي للأثر، وPlugin بلا اتصال، وTelegram، مقابل ملف tarball نفسه للحزمة المحلولة. لا تزال فحوصات الإصدار عبر أنظمة التشغيل تغطي الإعداد الأولي الخاص بنظام التشغيل، والمثبّت، وسلوك المنصة؛ وينبغي أن يبدأ تحقق منتج الحزمة/التحديث بـ Package Acceptance. تتحقق مسارات الحزمة والمثبّت الجديد على Windows أيضًا من أن الحزمة المثبتة يمكنها استيراد تجاوز تحكم بالمتصفح من مسار Windows مطلق خام. يستخدم اختبار دخان دورة وكيل OpenAI عبر أنظمة التشغيل `OPENCLAW_CROSS_OS_OPENAI_MODEL` افتراضيًا عند ضبطه، وإلا يستخدم `openai/gpt-5.4-mini`، حتى يبقى إثبات التثبيت وGateway سريعًا وحتميًا. +تستدعي فحوصات الإصدار Package Acceptance باستخدام `source=ref` و`package_ref=` و`workflow_ref=` و`suite_profile=custom` و`docker_lanes='bundled-channel-deps-compat plugins-offline'` و`telegram_mode=mock-openai`. تغطي أجزاء Docker لمسار الإصدار مسارات الحزمة/التحديث/Plugin المتداخلة؛ وتحافظ Package Acceptance على إثبات توافق القنوات المضمنة الأصلي للقطعة، وPlugin دون اتصال، وTelegram مقابل أرشيف الحزمة نفسه الذي تم حله. ما زالت فحوصات الإصدار عبر أنظمة التشغيل تغطي الإعداد الأولي الخاص بنظام التشغيل، والمثبّت، وسلوك المنصة؛ ويجب أن يبدأ تحقق المنتج للحزمة/التحديث من Package Acceptance. تتحقق مسارات Windows المعبأة والمثبّت الجديد أيضًا من أن الحزمة المثبتة يمكنها استيراد تجاوز للتحكم في المتصفح من مسار Windows خام ومطلق. يعتمد اختبار الدخان لدورة وكيل OpenAI عبر أنظمة التشغيل افتراضيًا على `OPENCLAW_CROSS_OS_OPENAI_MODEL` عند ضبطه، وإلا يستخدم `openai/gpt-5.4-mini`، بحيث يبقى إثبات التثبيت وGateway سريعًا وحتميًا. -### نوافذ التوافق القديمة +### نوافذ التوافق القديم -لدى Package Acceptance نوافذ توافق قديمة محدودة للحزم المنشورة مسبقًا. يمكن للحزم حتى `2026.4.25`، بما في ذلك `2026.4.25-beta.*`، استخدام مسار التوافق: +تملك Package Acceptance نوافذ توافق قديم محدودة للحزم المنشورة مسبقًا. يمكن للحزم حتى `2026.4.25`، بما في ذلك `2026.4.25-beta.*`، استخدام مسار التوافق: -- قد تشير إدخالات QA الخاصة المعروفة في `dist/postinstall-inventory.json` إلى ملفات محذوفة من ملف tarball؛ +- قد تشير إدخالات QA الخاصة المعروفة في `dist/postinstall-inventory.json` إلى ملفات محذوفة من الأرشيف؛ - قد يتخطى `doctor-switch` الحالة الفرعية لاستمرارية `gateway install --wrapper` عندما لا تعرض الحزمة ذلك العلم؛ -- قد يزيل `update-channel-switch` اعتماديات `pnpm.patchedDependencies` المفقودة من نموذج git الزائف المشتق من ملف tarball وقد يسجل فقدان `update.channel` المستمر؛ -- قد تقرأ اختبارات دخان Plugin مواقع سجل تثبيت قديمة أو تقبل فقدان استمرارية سجل تثبيت marketplace؛ -- قد يسمح `plugin-update` بترحيل بيانات وصف التكوين مع الاستمرار في اشتراط بقاء سجل التثبيت وسلوك عدم إعادة التثبيت دون تغيير. +- قد يزيل `update-channel-switch` قيم `pnpm.patchedDependencies` المفقودة من تجهيزة git الوهمية المشتقة من الأرشيف، وقد يسجّل غياب `update.channel` المستمر؛ +- قد تقرأ اختبارات الدخان الخاصة بـ Plugin مواقع سجل تثبيت قديمة أو تقبل غياب استمرارية سجل تثبيت السوق؛ +- قد يسمح `plugin-update` بترحيل بيانات تعريف التهيئة مع استمرار اشتراط بقاء سجل التثبيت وسلوك عدم إعادة التثبيت دون تغيير. -قد تحذر حزمة `2026.4.26` المنشورة أيضًا من ملفات ختم بيانات وصف البناء المحلي التي شُحنت مسبقًا. يجب أن تستوفي الحزم اللاحقة العقود الحديثة؛ وتفشل الحالات نفسها بدلًا من التحذير أو التخطي. +قد تحذر حزمة `2026.4.26` المنشورة أيضًا من ملفات ختم بيانات تعريف البناء المحلي التي كانت قد شُحنت بالفعل. يجب أن تفي الحزم اللاحقة بالعقود الحديثة؛ وتفشل الشروط نفسها بدلًا من التحذير أو التخطي. ### أمثلة @@ -238,111 +238,111 @@ gh workflow run package-acceptance.yml \ -f docker_lanes='install-e2e plugin-update' ``` -عند تصحيح تشغيل Package Acceptance فاشل، ابدأ من ملخص `resolve_package` لتأكيد مصدر الحزمة وإصدارها وSHA-256. ثم افحص التشغيل الفرعي `docker_acceptance` وآثار Docker الخاصة به: `.artifacts/docker-tests/**/summary.json` و`failures.json` وسجلات المسارات وتوقيتات المراحل وأوامر إعادة التشغيل. فضّل إعادة تشغيل ملف تعريف الحزمة الفاشل أو مسارات Docker الدقيقة بدلًا من إعادة تشغيل تحقق الإصدار الكامل. +عند تصحيح تشغيل فاشل لقبول الحزمة، ابدأ من ملخص `resolve_package` لتأكيد مصدر الحزمة وإصدارها وSHA-256. ثم افحص تشغيل الابن `docker_acceptance` وقطع Docker الأثرية الخاصة به: `.artifacts/docker-tests/**/summary.json` و`failures.json` وسجلات المسارات وتوقيتات المراحل وأوامر إعادة التشغيل. فضّل إعادة تشغيل ملف تعريف الحزمة الفاشل أو مسارات Docker الدقيقة بدلًا من إعادة تشغيل تحقق الإصدار الكامل. -## دخان التثبيت +## اختبار دخان التثبيت -يعيد سير عمل `Install Smoke` المنفصل استخدام سكربت النطاق نفسه من خلال مهمة `preflight` الخاصة به. يقسم تغطية الدخان إلى `run_fast_install_smoke` و`run_full_install_smoke`. +يعيد سير العمل المنفصل `Install Smoke` استخدام سكربت النطاق نفسه من خلال مهمة `preflight` الخاصة به. يقسم تغطية الدخان إلى `run_fast_install_smoke` و`run_full_install_smoke`. -- يشغّل **المسار السريع** لطلبات السحب التي تلمس أسطح Docker/الحزمة، أو تغييرات حزمة/بيان Plugin المضمّن، أو أسطح Plugin/القناة/Gateway/Plugin SDK الأساسية التي تمارسها وظائف دخان Docker. تغييرات Plugin المضمّن الخاصة بالمصدر فقط، وتعديلات الاختبارات فقط، وتعديلات الوثائق فقط لا تحجز عمال Docker. يبني المسار السريع صورة Dockerfile الجذرية مرة واحدة، ويفحص CLI، ويشغّل دخان CLI لحذف الوكلاء في مساحة العمل المشتركة، ويشغّل اختبار gateway-network e2e في الحاوية، ويتحقق من معامل بناء امتداد مضمّن، ويشغّل ملف تعريف Docker المحدود لـPlugin المضمّن ضمن مهلة إجمالية للأمر قدرها 240 ثانية (مع تحديد كل تشغيل Docker لكل سيناريو على حدة). -- يبقي **المسار الكامل** تثبيت حزمة QR وتغطية Docker/التحديث للمثبّت للتشغيلات الليلية المجدولة، والإرسال اليدوي، وفحوصات إصدار workflow-call، وطلبات السحب التي تلمس فعلًا أسطح المثبّت/الحزمة/Docker. في الوضع الكامل، يجهز install-smoke صورة دخان GHCR مستهدفة لـSHA الحالي من Dockerfile الجذري أو يعيد استخدامها، ثم يشغّل تثبيت حزمة QR، ودخان Dockerfile/Gateway الجذري، ودخان المثبّت/التحديث، وDocker E2E السريع لـPlugin المضمّن كوظائف منفصلة حتى لا ينتظر عمل المثبّت خلف دخان الصورة الجذرية. +- يشغّل **المسار السريع** لطلبات السحب التي تلمس أسطح Docker/الحزمة، أو تغييرات حزمة/بيان Plugin المضمنة، أو أسطح Plugin/القناة/Gateway/Plugin SDK الأساسية التي تمارسها مهام دخان Docker. لا تحجز تغييرات Plugin المصدرية المضمنة فقط، والتعديلات الخاصة بالاختبارات فقط، والتعديلات الخاصة بالتوثيق فقط، عمال Docker. يبني المسار السريع صورة Dockerfile الجذرية مرة واحدة، ويتحقق من CLI، ويشغّل اختبار دخان CLI لحذف الوكلاء من مساحة العمل المشتركة، ويشغّل اختبار e2e لشبكة Gateway داخل الحاوية، ويتحقق من وسيطة بناء لامتداد مضمن، ويشغّل ملف تعريف Docker المحدود لـ Plugin المضمنة ضمن مهلة أوامر إجمالية قدرها 240 ثانية (مع تحديد كل تشغيل Docker لكل سيناريو على حدة). +- يحتفظ **المسار الكامل** بتثبيت حزمة QR وتغطية Docker/التحديث للمثبّت للتشغيلات الليلية المجدولة، وعمليات التشغيل اليدوية، وفحوصات الإصدار عبر workflow-call، وطلبات السحب التي تلمس فعلًا أسطح المثبّت/الحزمة/Docker. في الوضع الكامل، يجهز install-smoke أو يعيد استخدام صورة دخان Dockerfile جذرية من GHCR لهدف SHA واحد، ثم يشغّل تثبيت حزمة QR، واختبارات دخان Dockerfile/Gateway الجذرية، واختبارات دخان المثبّت/التحديث، وDocker E2E السريع لـ Plugin المضمنة كمهام منفصلة كي لا ينتظر عمل المثبّت خلف اختبارات دخان الصورة الجذرية. -لا تفرض دفعات `main` (بما فيها التزامات الدمج) المسار الكامل؛ عندما يطلب منطق نطاق التغيير تغطية كاملة عند الدفع، يحافظ سير العمل على دخان Docker السريع ويترك دخان التثبيت الكامل للتحقق الليلي أو تحقق الإصدار. +لا تفرض دفعات `main` (بما في ذلك التزامات الدمج) المسار الكامل؛ عندما يطلب منطق النطاق المتغير تغطية كاملة عند دفعة، يحتفظ سير العمل بدخان Docker السريع ويترك دخان التثبيت الكامل للتحقق الليلي أو تحقق الإصدار. -يُحرس دخان مزود الصورة لتثبيت Bun العام البطيء بشكل منفصل عبر `run_bun_global_install_smoke`. يعمل على الجدول الليلي ومن سير عمل فحوصات الإصدار، ويمكن لإرسالات `Install Smoke` اليدوية الاشتراك فيه، لكن طلبات السحب ودفعات `main` لا تفعل ذلك. تحتفظ اختبارات QR وDocker للمثبّت بملفات Dockerfile الخاصة بها المركزة على التثبيت. +يُحاط اختبار دخان موفر الصور لتثبيت Bun العام البطيء بشكل منفصل عبر `run_bun_global_install_smoke`. يعمل وفق الجدول الليلي ومن سير عمل فحوصات الإصدار، ويمكن لعمليات تشغيل `Install Smoke` اليدوية الاشتراك فيه، لكن طلبات السحب ودفعات `main` لا تفعل ذلك. تحتفظ اختبارات Docker الخاصة بـ QR والمثبّت بملفات Dockerfile الخاصة بها والمركزة على التثبيت. ## Docker E2E المحلي -يبني `pnpm test:docker:all` مسبقًا صورة اختبار مباشر مشتركة واحدة، ويحزم OpenClaw مرة واحدة كملف tarball من npm، ويبني صورتين مشتركتين من `scripts/e2e/Dockerfile`: +يبني `pnpm test:docker:all` مسبقًا صورة اختبار مباشر مشتركة واحدة، ويحزم OpenClaw مرة واحدة كأرشيف npm، ويبني صورتين مشتركتين من `scripts/e2e/Dockerfile`: -- مشغّل Node/Git مجرد لمسارات المثبّت/التحديث/اعتماديات Plugin؛ -- صورة وظيفية تثبّت ملف tarball نفسه في `/app` لمسارات الوظائف العادية. +- مشغّل Node/Git مجرد لمسارات المثبّت/التحديث/اعتمادية Plugin؛ +- صورة وظيفية تثبّت الأرشيف نفسه في `/app` لمسارات الوظائف العادية. -توجد تعريفات مسارات Docker في `scripts/lib/docker-e2e-scenarios.mjs`، ويقع منطق المخطط في `scripts/lib/docker-e2e-plan.mjs`، ولا ينفذ المشغّل إلا الخطة المحددة. يختار المجدول الصورة لكل مسار باستخدام `OPENCLAW_DOCKER_E2E_BARE_IMAGE` و`OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`، ثم يشغّل المسارات باستخدام `OPENCLAW_SKIP_DOCKER_BUILD=1`. +توجد تعريفات مسارات Docker في `scripts/lib/docker-e2e-scenarios.mjs`، ويعيش منطق المخطط في `scripts/lib/docker-e2e-plan.mjs`، ولا ينفذ المشغّل إلا الخطة المحددة. يحدد المجدول الصورة لكل مسار باستخدام `OPENCLAW_DOCKER_E2E_BARE_IMAGE` و`OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`، ثم يشغّل المسارات باستخدام `OPENCLAW_SKIP_DOCKER_BUILD=1`. -### القيم القابلة للضبط +### المعاملات القابلة للضبط -| المتغير | الافتراضي | الغرض | -| -------------------------------------- | ------- | --------------------------------------------------------------------------------------------- | -| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | عدد خانات المجموعة الرئيسية للمسارات العادية. | -| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | عدد خانات مجموعة الذيل الحساسة للمزود. | -| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | حد المسارات المباشرة المتزامنة حتى لا تخنق المزودات. | -| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | حد مسارات تثبيت npm المتزامنة. | -| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | حد مسارات الخدمات المتعددة المتزامنة. | -| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | التأخير بين بدايات المسارات لتجنب عواصف إنشاء Docker daemon؛ اضبطه على `0` لعدم التأخير. | -| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | مهلة احتياطية لكل مسار (120 دقيقة)؛ تستخدم مسارات مباشرة/ذيلية محددة حدودًا أضيق. | -| `OPENCLAW_DOCKER_ALL_DRY_RUN` | غير مضبوط | يطبع `1` خطة المجدول دون تشغيل المسارات. | -| `OPENCLAW_DOCKER_ALL_LANES` | غير مضبوط | قائمة مسارات دقيقة مفصولة بفواصل؛ تتخطى دخان التنظيف حتى يتمكن الوكلاء من إعادة إنتاج مسار فاشل واحد. | +| المتغير | الافتراضي | الغرض | +| -------------------------------------- | --------- | --------------------------------------------------------------------------------------------- | +| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | عدد خانات التجمع الرئيسي للمسارات العادية. | +| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | عدد خانات تجمع الذيل الحساس للموفر. | +| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | حد المسارات المباشرة المتزامنة كي لا يقيّد الموفرون المعدل. | +| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | حد مسارات تثبيت npm المتزامنة. | +| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | حد مسارات الخدمات المتعددة المتزامنة. | +| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | تباعد بين بدايات المسارات لتجنب عواصف إنشاء عفريت Docker؛ اضبط `0` لعدم التباعد. | +| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | مهلة احتياطية لكل مسار (120 دقيقة)؛ تستخدم مسارات مباشرة/ذيلية محددة حدودًا أضيق. | +| `OPENCLAW_DOCKER_ALL_DRY_RUN` | غير مضبوط | يطبع `1` خطة المجدول دون تشغيل المسارات. | +| `OPENCLAW_DOCKER_ALL_LANES` | غير مضبوط | قائمة دقيقة مفصولة بفواصل للمسارات؛ تتخطى دخان التنظيف كي يتمكن الوكلاء من إعادة إنتاج مسار فاشل واحد. | -يمكن لمسار أثقل من حده الفعال أن يبدأ مع ذلك من مجموعة فارغة، ثم يعمل بمفرده حتى يحرر السعة. تنفذ عملية التجميع المحلية فحوصات Docker المسبقة، وتزيل حاويات OpenClaw E2E القديمة، وتصدر حالة المسارات النشطة، وتحفظ توقيتات المسارات للترتيب من الأطول أولًا، وتتوقف افتراضيًا عن جدولة مسارات مجمعة جديدة بعد أول فشل. +يمكن لمسار أثقل من سقفه الفعّال أن يبدأ مع ذلك من تجمع فارغ، ثم يعمل وحده حتى يحرر السعة. تنفذ التجميعة المحلية فحوصات مسبقة لـ Docker، وتزيل حاويات OpenClaw E2E القديمة، وتصدر حالة المسارات النشطة، وتحفظ توقيتات المسارات للترتيب من الأطول أولًا، وتتوقف افتراضيًا عن جدولة مسارات مجمعة جديدة بعد أول فشل. ### سير عمل مباشر/E2E قابل لإعادة الاستخدام -يسأل سير العمل المباشر/E2E القابل لإعادة الاستخدام `scripts/test-docker-all.mjs --plan-json` عن الحزمة ونوع الصورة والصورة المباشرة والمسار وتغطية بيانات الاعتماد المطلوبة. ثم يحول `scripts/docker-e2e.mjs` تلك الخطة إلى مخرجات GitHub وملخصات. إما أن يحزم OpenClaw عبر `scripts/package-openclaw-for-docker.mjs`، أو يحمّل أثر حزمة من التشغيل الحالي، أو يحمّل أثر حزمة من `package_artifact_run_id`؛ ويتحقق من مخزون ملف tarball؛ ويبني ويدفع صور GHCR Docker E2E العارية/الوظيفية الموسومة بملخص الحزمة عبر ذاكرة التخزين المؤقت لطبقات Docker من Blacksmith عندما تحتاج الخطة إلى مسارات ذات حزمة مثبتة؛ ويعيد استخدام مدخلات `docker_e2e_bare_image`/`docker_e2e_functional_image` المقدمة أو صور ملخص الحزمة الموجودة بدلًا من إعادة البناء. تُعاد محاولات سحب صور Docker بمهلة محدودة قدرها 180 ثانية لكل محاولة حتى يعيد تدفق سجل/ذاكرة تخزين مؤقت عالق المحاولة بسرعة بدلًا من استهلاك معظم المسار الحرج في CI. +يسأل سير العمل المباشر/E2E القابل لإعادة الاستخدام `scripts/test-docker-all.mjs --plan-json` عن الحزمة ونوع الصورة والصورة المباشرة والمسار وتغطية بيانات الاعتماد المطلوبة. ثم يحول `scripts/docker-e2e.mjs` تلك الخطة إلى مخرجات وملخصات GitHub. إما أن يحزم OpenClaw عبر `scripts/package-openclaw-for-docker.mjs`، أو ينزّل قطعة حزمة من التشغيل الحالي، أو ينزّل قطعة حزمة من `package_artifact_run_id`؛ ويتحقق من مخزون الأرشيف؛ ويبني ويدفع صور Docker E2E المجردة/الوظيفية الموسومة بملخص الحزمة إلى GHCR من خلال ذاكرة التخزين المؤقت لطبقات Docker في Blacksmith عندما تحتاج الخطة إلى مسارات بحزمة مثبتة؛ ويعيد استخدام مدخلات `docker_e2e_bare_image`/`docker_e2e_functional_image` المقدمة أو صور ملخص الحزمة الموجودة بدلًا من إعادة البناء. تعاد محاولة سحب صور Docker بمهلة محدودة قدرها 180 ثانية لكل محاولة، بحيث تعاد محاولة دفق سجل/ذاكرة تخزين مؤقت عالق بسرعة بدلًا من استهلاك معظم المسار الحرج في CI. ### أجزاء مسار الإصدار -تعمل تغطية Docker للإصدار كوظائف أصغر مقسمة باستخدام `OPENCLAW_SKIP_DOCKER_BUILD=1` حتى يسحب كل جزء نوع الصورة الذي يحتاجه فقط وينفذ مسارات متعددة عبر المجدول الموزون نفسه: +تعمل تغطية Docker للإصدار كمهام مجزأة أصغر باستخدام `OPENCLAW_SKIP_DOCKER_BUILD=1` بحيث يسحب كل جزء نوع الصورة الذي يحتاجه فقط وينفذ عدة مسارات عبر المجدول الموزون نفسه: - `OPENCLAW_DOCKER_ALL_PROFILE=release-path` - `OPENCLAW_DOCKER_ALL_CHUNK=core | package-update-openai | package-update-anthropic | package-update-core | plugins-runtime-plugins | plugins-runtime-services | plugins-runtime-install-a..h | bundled-channels` -تجزئات Docker للإصدار الحالي هي `core` و`package-update-openai` و`package-update-anthropic` و`package-update-core` و`plugins-runtime-plugins` و`plugins-runtime-services` و`plugins-runtime-install-a` حتى `plugins-runtime-install-h` و`bundled-channels-core` و`bundled-channels-update-a` و`bundled-channels-update-discord` و`bundled-channels-update-b` و`bundled-channels-contracts`. تظل التجزئة التجميعية `bundled-channels` متاحة لإعادة التشغيل اليدوية لمرة واحدة، وتظل `plugins-runtime-core` و`plugins-runtime` و`plugins-integrations` أسماء مستعارة تجميعية للـ Plugin/وقت التشغيل. يظل الاسم المستعار للمسار `install-e2e` هو الاسم المستعار التجميعي لإعادة التشغيل اليدوية لكلا مساري تثبيت المزوّد. تشغّل تجزئة `bundled-channels` مسارات `bundled-channel-*` و`bundled-channel-update-*` المقسّمة بدلًا من مسار `bundled-channel-deps` التسلسلي الجامع. +مقاطع Docker للإصدار الحالي هي `core` و`package-update-openai` و`package-update-anthropic` و`package-update-core` و`plugins-runtime-plugins` و`plugins-runtime-services` و`plugins-runtime-install-a` حتى `plugins-runtime-install-h` و`bundled-channels-core` و`bundled-channels-update-a` و`bundled-channels-update-discord` و`bundled-channels-update-b` و`bundled-channels-contracts`. يظل المقطع التجميعي `bundled-channels` متاحًا لإعادة التشغيل اليدوية لمرة واحدة، وتظل `plugins-runtime-core` و`plugins-runtime` و`plugins-integrations` أسماء مستعارة تجميعية للـ Plugin/وقت التشغيل. يظل الاسم المستعار للمسار `install-e2e` هو الاسم المستعار التجميعي لإعادة التشغيل اليدوية لكلا مساري مثبّت المزوّدين. يشغّل المقطع `bundled-channels` مسارات `bundled-channel-*` و`bundled-channel-update-*` المقسّمة بدلًا من المسار التسلسلي الشامل `bundled-channel-deps`. -يُضمّن OpenWebUI داخل `plugins-runtime-services` عندما تطلبه تغطية مسار الإصدار الكاملة، ويحتفظ بتجزئة مستقلة `openwebui` فقط لعمليات الإرسال الخاصة بـ OpenWebUI وحده. تعيد مسارات تحديث القنوات المضمّنة المحاولة مرة واحدة عند حدوث إخفاقات عابرة في شبكة npm. +يُدمج OpenWebUI في `plugins-runtime-services` عندما تطلب تغطية مسار الإصدار الكامل ذلك، ويحتفظ بمقطع مستقل `openwebui` فقط لعمليات الإرسال الخاصة بـ OpenWebUI وحده. تعيد مسارات تحديث القنوات المضمّنة المحاولة مرة واحدة عند إخفاقات شبكة npm العابرة. -ترفع كل تجزئة `.artifacts/docker-tests/` مع سجلات المسارات، والتوقيتات، و`summary.json`، و`failures.json`، وتوقيتات المراحل، وJSON خطة المجدول، وجداول المسارات البطيئة، وأوامر إعادة التشغيل لكل مسار. يشغّل إدخال سير العمل `docker_lanes` المسارات المحددة مقابل الصور المُحضّرة بدلًا من وظائف التجزئة، ما يُبقي تصحيح المسار الفاشل محدودًا بوظيفة Docker واحدة مستهدفة، ويحضّر أو ينزّل أو يعيد استخدام أثر الحزمة لذلك التشغيل؛ إذا كان المسار المحدد مسار Docker حيًا، فإن الوظيفة المستهدفة تبني صورة الاختبار الحي محليًا لإعادة التشغيل تلك. تتضمن أوامر GitHub المُنشأة لإعادة التشغيل لكل مسار `package_artifact_run_id` و`package_artifact_name` ومدخلات الصور المُحضّرة عند وجود تلك القيم، بحيث يمكن لمسار فاشل إعادة استخدام الحزمة والصور نفسها من التشغيل الفاشل. +يرفع كل مقطع `.artifacts/docker-tests/` متضمنًا سجلات المسارات، والتوقيتات، و`summary.json`، و`failures.json`، وتوقيتات المراحل، وملف JSON لخطة المجدول، وجداول المسارات البطيئة، وأوامر إعادة التشغيل لكل مسار. يشغّل إدخال سير العمل `docker_lanes` المسارات المحددة مقابل الصور المحضّرة بدلًا من وظائف المقاطع، مما يبقي تصحيح أخطاء المسارات الفاشلة محدودًا في وظيفة Docker واحدة مستهدفة، ويحضّر أثر الحزمة أو ينزّله أو يعيد استخدامه لذلك التشغيل؛ إذا كان المسار المحدد مسار Docker حيًا، تبني الوظيفة المستهدفة صورة الاختبار الحي محليًا لإعادة التشغيل تلك. تتضمن أوامر GitHub المولّدة لإعادة التشغيل لكل مسار `package_artifact_run_id` و`package_artifact_name` ومدخلات الصور المحضّرة عند وجود تلك القيم، بحيث يستطيع المسار الفاشل إعادة استخدام الحزمة والصور نفسها من التشغيل الفاشل. ```bash pnpm test:docker:rerun # download Docker artifacts and print combined/per-lane targeted rerun commands pnpm test:docker:timings # slow-lane and phase critical-path summaries ``` -يشغّل سير العمل الحي/E2E المجدول مجموعة Docker الكاملة لمسار الإصدار يوميًا. +يشغّل سير عمل live/E2E المجدول مجموعة Docker الكاملة لمسار الإصدار يوميًا. -## ما قبل إصدار Plugin +## الإصدار التمهيدي للـ Plugin -`Plugin Prerelease` هو تغطية منتج/حزمة أعلى كلفة، لذلك فهو سير عمل منفصل يُرسل بواسطة `Full Release Validation` أو بواسطة مشغّل صريح. تُبقي طلبات السحب العادية، ودفعات `main`، وعمليات الإرسال اليدوية المستقلة لـ CI هذه المجموعة معطلة. يوازن اختبارات Plugin المضمّنة عبر ثمانية عمال امتدادات؛ وتشغّل وظائف تجزئة الامتدادات هذه ما يصل إلى مجموعتي تكوين Plugin في الوقت نفسه مع عامل Vitest واحد لكل مجموعة وذاكرة Node أكبر، حتى لا تنشئ دفعات Plugin كثيفة الاستيراد وظائف CI إضافية. +`Plugin Prerelease` هو تغطية منتج/حزمة أعلى تكلفة، لذلك فهو سير عمل منفصل يُطلقه `Full Release Validation` أو مشغّل صريح. تبقي طلبات السحب العادية، ودفعات `main`، وعمليات إرسال CI اليدوية المستقلة، هذه المجموعة معطلة. يوازن اختبارات الـ Plugin المضمّنة عبر ثمانية عمال امتدادات؛ وتشغّل وظائف شظايا الامتدادات هذه ما يصل إلى مجموعتي إعداد Plugin في الوقت نفسه مع عامل Vitest واحد لكل مجموعة وحجم ذاكرة Node أكبر حتى لا تنشئ دفعات Plugin الثقيلة في الاستيراد وظائف CI إضافية. -## مختبر QA +## مختبر ضمان الجودة -لمختبر QA مسارات CI مخصصة خارج سير العمل الرئيسي ذي النطاق الذكي. +لدى مختبر ضمان الجودة مسارات CI مخصصة خارج سير العمل الرئيسي ذي النطاق الذكي. -- يعمل سير العمل `Parity gate` عند تغييرات PR المطابقة والإرسال اليدوي؛ فيبني وقت تشغيل QA الخاص ويقارن حزم الوكلاء الوظيفية الوهمية GPT-5.5 وOpus 4.6. -- يعمل سير العمل `QA-Lab - All Lanes` كل ليلة على `main` وعند الإرسال اليدوي؛ ويوزّع بوابة التكافؤ الوهمية، ومسار Matrix الحي، ومساري Telegram وDiscord الحيين كوظائف متوازية. تستخدم الوظائف الحية بيئة `qa-live-shared`، ويستخدم Telegram/Discord عقود إيجار Convex. +- يعمل سير العمل `Parity gate` عند تغييرات PR المطابقة وعند الإرسال اليدوي؛ فهو يبني وقت تشغيل ضمان الجودة الخاص ويقارن حزم الوكلاء الوهمية GPT-5.5 وOpus 4.6. +- يعمل سير العمل `QA-Lab - All Lanes` ليلًا على `main` وعند الإرسال اليدوي؛ ويفرّع بوابة التكافؤ الوهمية، ومسار Matrix الحي، ومساري Telegram وDiscord الحيين كوظائف متوازية. تستخدم الوظائف الحية بيئة `qa-live-shared`، ويستخدم Telegram/Discord عقود Convex. -تشغّل فحوصات الإصدار مساري نقل Matrix وTelegram الحيين مع مزوّد وهمي حتمي ونماذج مؤهلة وهميًا (`mock-openai/gpt-5.5` و`mock-openai/gpt-5.5-alt`) بحيث يُعزل عقد القناة عن تأخر النموذج الحي وبدء تشغيل Plugin المزوّد العادي. يعطّل Gateway النقل الحي البحث في الذاكرة لأن تكافؤ QA يغطي سلوك الذاكرة بشكل منفصل؛ وتُغطى قابلية اتصال المزوّد بواسطة مجموعات النموذج الحي، والمزوّد الأصلي، ومزوّد Docker المنفصلة. +تشغّل فحوصات الإصدار مساري النقل الحيين Matrix وTelegram باستخدام المزوّد الوهمي الحتمي والنماذج المؤهلة للوهم (`mock-openai/gpt-5.5` و`mock-openai/gpt-5.5-alt`) بحيث يكون عقد القناة معزولًا عن زمن استجابة النموذج الحي وبدء تشغيل Plugin المزوّد العادي. يعطل Gateway النقل الحي بحث الذاكرة لأن تكافؤ ضمان الجودة يغطي سلوك الذاكرة بشكل منفصل؛ وتغطي مجموعات النماذج الحية والمزوّدات الأصلية ومزوّدات Docker المنفصلة اتصال المزوّد. -يستخدم Matrix `--profile fast` للبوابات المجدولة وبوابات الإصدار، مع إضافة `--fail-fast` فقط عندما يدعمها CLI الذي تم سحبه. يظل الإعداد الافتراضي لـ CLI وإدخال سير العمل اليدوي `all`؛ ويجزّئ إرسال `matrix_profile=all` اليدوي دائمًا تغطية Matrix الكاملة إلى وظائف `transport` و`media` و`e2ee-smoke` و`e2ee-deep` و`e2ee-cli`. +يستخدم Matrix الخيار `--profile fast` للبوابات المجدولة وبوابات الإصدار، مع إضافة `--fail-fast` فقط عندما يدعم CLI المستخرج ذلك. يظل الافتراضي في CLI وإدخال سير العمل اليدوي `all`؛ وتؤدي عملية إرسال `matrix_profile=all` اليدوية دائمًا إلى تقسيم تغطية Matrix الكاملة إلى وظائف `transport` و`media` و`e2ee-smoke` و`e2ee-deep` و`e2ee-cli`. -يشغّل `OpenClaw Release Checks` أيضًا مسارات مختبر QA الحرجة للإصدار قبل الموافقة على الإصدار؛ وتشغّل بوابة تكافؤ QA الخاصة به حزم المرشح والأساس كوظائف مسارات متوازية، ثم تنزّل كلا الأثرين إلى وظيفة تقرير صغيرة للمقارنة النهائية للتكافؤ. +يشغّل `OpenClaw Release Checks` أيضًا مسارات مختبر ضمان الجودة الحرجة للإصدار قبل موافقة الإصدار؛ وتشغّل بوابة تكافؤ ضمان الجودة الخاصة به حزم المرشح والأساس كوظائف مسارات متوازية، ثم تنزّل كلا الأثرين إلى وظيفة تقرير صغيرة للمقارنة النهائية للتكافؤ. -لا تضع مسار هبوط PR خلف `Parity gate` إلا إذا كان التغيير يمس فعليًا وقت تشغيل QA، أو تكافؤ حزم النماذج، أو سطحًا يملكه سير عمل التكافؤ. بالنسبة لإصلاحات القنوات العادية، أو التكوين، أو الوثائق، أو اختبارات الوحدة، تعامل معه كإشارة اختيارية واتبع أدلة CI/الفحص ذات النطاق المحدد بدلًا من ذلك. +لا تضع مسار دمج PR خلف `Parity gate` إلا إذا كان التغيير يمس فعليًا وقت تشغيل ضمان الجودة، أو تكافؤ حزم النماذج، أو سطحًا يملكه سير عمل التكافؤ. بالنسبة لإصلاحات القنوات أو الإعدادات أو الوثائق أو اختبارات الوحدة العادية، تعامل معه كإشارة اختيارية واتبع أدلة CI/الفحوصات ذات النطاق المحدد بدلًا من ذلك. ## CodeQL -سير العمل `CodeQL` هو ماسح أمان ضيق للمرور الأول عمدًا، وليس مسحًا كاملًا للمستودع. تفحص عمليات الحراسة اليومية واليدوية وطلبات السحب غير المسودة كود سير عمل Actions إضافة إلى أسطح JavaScript/TypeScript الأعلى خطرًا باستخدام استعلامات أمان عالية الثقة مفلترة إلى `security-severity` عالٍ/حرج. +سير عمل `CodeQL` هو عمدًا ماسح أمان أولي ضيق النطاق، وليس مسحًا كاملًا للمستودع. تقوم عمليات الحراسة اليومية واليدوية وطلبات السحب غير المسودة بفحص كود سير عمل Actions إضافة إلى أعلى أسطح JavaScript/TypeScript خطورةً باستخدام استعلامات أمان عالية الثقة مرشحة إلى `security-severity` عالية/حرجة. -يبقى حارس طلب السحب خفيفًا: فهو يبدأ فقط للتغييرات تحت `.github/actions` أو`.github/codeql` أو`.github/workflows` أو`packages` أو`src`، ويشغّل مصفوفة الأمان عالية الثقة نفسها مثل سير العمل المجدول. يبقى CodeQL الخاص بـ Android وmacOS خارج الإعدادات الافتراضية لطلبات السحب. +تظل حراسة طلب السحب خفيفة: فهي تبدأ فقط للتغييرات ضمن `.github/actions` أو `.github/codeql` أو `.github/workflows` أو `packages` أو `src`، وتشغّل مصفوفة الأمان عالية الثقة نفسها مثل سير العمل المجدول. يبقى Android وmacOS CodeQL خارج افتراضيات PR. ### فئات الأمان -| الفئة | السطح | +| الفئة | السطح | | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | -| `/codeql-security-high/core-auth-secrets` | المصادقة، الأسرار، الصندوق الرملي، Cron، وخط أساس Gateway | -| `/codeql-security-high/channel-runtime-boundary` | عقود تنفيذ القناة الأساسية إضافة إلى وقت تشغيل Plugin القناة، وGateway، وPlugin SDK، والأسرار، ونقاط تماس التدقيق | -| `/codeql-security-high/network-ssrf-boundary` | أسطح SSRF الأساسية، وتحليل IP، وحارس الشبكة، وجلب الويب، وسياسة SSRF في Plugin SDK | -| `/codeql-security-high/mcp-process-tool-boundary` | خوادم MCP، ومساعدات تنفيذ العمليات، والتسليم الصادر، وبوابات تنفيذ أدوات الوكيل | -| `/codeql-security-high/plugin-trust-boundary` | أسطح الثقة لتثبيت Plugin، والمحمّل، والبيان، والسجل، وتجهيز اعتماديات وقت التشغيل، وتحميل المصدر، وعقد حزمة Plugin SDK | +| `/codeql-security-high/core-auth-secrets` | المصادقة والأسرار وبيئة العزل وCron وخط أساس Gateway | +| `/codeql-security-high/channel-runtime-boundary` | عقود تنفيذ القنوات الأساسية إضافة إلى وقت تشغيل Plugin القنوات وGateway وPlugin SDK والأسرار ونقاط تدقيق المراجعة | +| `/codeql-security-high/network-ssrf-boundary` | أسطح SSRF الأساسية وتحليل IP وحارس الشبكة وweb-fetch وسياسة SSRF في Plugin SDK | +| `/codeql-security-high/mcp-process-tool-boundary` | خوادم MCP ومساعدات تنفيذ العمليات والتسليم الصادر وبوابات تنفيذ أدوات الوكيل | +| `/codeql-security-high/plugin-trust-boundary` | أسطح ثقة تثبيت Plugin والمحمّل والبيان والسجل وتجهيز تبعيات وقت التشغيل وتحميل المصادر وعقد حزمة Plugin SDK | -### تجزئات أمان خاصة بالمنصة +### شظايا الأمان الخاصة بالمنصات -- `CodeQL Android Critical Security` — تجزئة أمان Android مجدولة. تبني تطبيق Android يدويًا لـ CodeQL على أصغر مشغّل Blacksmith Linux تقبله سلامة سير العمل. ترفع تحت `/codeql-critical-security/android`. -- `CodeQL macOS Critical Security` — تجزئة أمان macOS أسبوعية/يدوية. تبني تطبيق macOS يدويًا لـ CodeQL على Blacksmith macOS، وتفلتر نتائج بناء الاعتماديات من SARIF المرفوع، وترفع تحت `/codeql-critical-security/macos`. محفوظة خارج الإعدادات الافتراضية اليومية لأن بناء macOS يهيمن على وقت التشغيل حتى عندما يكون نظيفًا. +- `CodeQL Android Critical Security` — شظية أمان Android مجدولة. تبني تطبيق Android يدويًا من أجل CodeQL على أصغر مشغّل Blacksmith Linux يقبله فحص سلامة سير العمل. ترفع ضمن `/codeql-critical-security/android`. +- `CodeQL macOS Critical Security` — شظية أمان macOS أسبوعية/يدوية. تبني تطبيق macOS يدويًا من أجل CodeQL على Blacksmith macOS، وتصفّي نتائج بناء التبعيات من SARIF المرفوع، وترفع ضمن `/codeql-critical-security/macos`. تُبقى خارج الافتراضيات اليومية لأن بناء macOS يهيمن على وقت التشغيل حتى عندما يكون نظيفًا. ### فئات الجودة الحرجة -`CodeQL Critical Quality` هي التجزئة غير الأمنية المطابقة. تشغّل فقط استعلامات جودة JavaScript/TypeScript غير الأمنية وبشدة خطأ على أسطح ضيقة عالية القيمة على مشغّل Blacksmith Linux الأصغر. حارس طلب السحب الخاص بها أصغر عمدًا من الملف المجدول: لا تشغّل طلبات السحب غير المسودة إلا تجزئات `agent-runtime-boundary` و`config-boundary` و`core-auth-secrets` و`channel-runtime-boundary` و`gateway-runtime-boundary` و`memory-runtime-boundary` و`mcp-process-runtime-boundary` و`provider-runtime-boundary` و`session-diagnostics-boundary` و`plugin-boundary` و`plugin-sdk-package-contract` و`plugin-sdk-reply-runtime` المطابقة عند تغييرات كود تنفيذ أوامر/نماذج/أدوات الوكيل وإرسال الردود، أو كود مخطط/ترحيل/إدخال وإخراج التكوين، أو كود المصادقة/الأسرار/الصندوق الرملي/الأمان، أو وقت تشغيل القناة الأساسية وPlugin القناة المضمّنة، أو بروتوكول Gateway/طريقة الخادم، أو وقت تشغيل الذاكرة/ربط SDK، أو MCP/العمليات/التسليم الصادر، أو وقت تشغيل المزوّد/كتالوج النماذج، أو تشخيصات الجلسة/صفوف التسليم، أو محمّل Plugin، أو عقد حزمة Plugin SDK، أو وقت تشغيل رد Plugin SDK. تشغّل تغييرات تكوين CodeQL وسير عمل الجودة جميع تجزئات جودة PR الاثنتي عشرة. +`CodeQL Critical Quality` هي الشظية غير الأمنية المقابلة. تشغّل فقط استعلامات جودة JavaScript/TypeScript غير الأمنية ذات شدة الخطأ على أسطح ضيقة عالية القيمة على مشغّل Blacksmith Linux الأصغر. حراسة طلب السحب الخاصة بها أصغر عمدًا من ملف التعريف المجدول: لا تشغّل طلبات السحب غير المسودة إلا شظايا `agent-runtime-boundary` و`config-boundary` و`core-auth-secrets` و`channel-runtime-boundary` و`gateway-runtime-boundary` و`memory-runtime-boundary` و`mcp-process-runtime-boundary` و`provider-runtime-boundary` و`session-diagnostics-boundary` و`plugin-boundary` و`plugin-sdk-package-contract` و`plugin-sdk-reply-runtime` المطابقة لتغييرات كود تنفيذ أوامر/نماذج/أدوات الوكيل وإرسال الردود، وكود مخطط/ترحيل/إدخال وإخراج الإعدادات، وكود المصادقة/الأسرار/العزل/الأمان، ووقت تشغيل القنوات الأساسية وPlugin القنوات المضمّنة، وبروتوكول Gateway/طريقة الخادم، ووقت تشغيل الذاكرة/ربط SDK، وMCP/العمليات/التسليم الصادر، ووقت تشغيل المزوّد/كتالوج النماذج، وتشخيصات الجلسة/صفوف التسليم، ومحمّل Plugin، وعقد حزمة Plugin SDK، أو تغييرات وقت تشغيل رد Plugin SDK. تشغّل تغييرات إعداد CodeQL وسير عمل الجودة جميع شظايا جودة PR الاثنتي عشرة. يقبل الإرسال اليدوي: @@ -350,40 +350,40 @@ pnpm test:docker:timings # slow-lane and phase critical-path summari profile=all|agent-runtime-boundary|config-boundary|core-auth-secrets|channel-runtime-boundary|gateway-runtime-boundary|memory-runtime-boundary|mcp-process-runtime-boundary|plugin-boundary|plugin-sdk-package-contract|plugin-sdk-reply-runtime|provider-runtime-boundary|session-diagnostics-boundary ``` -الملفات الضيقة هي خطافات تعليم/تكرار لتشغيل تجزئة جودة واحدة بمعزل. +ملفات التعريف الضيقة هي خطافات تعليم/تكرار لتشغيل شظية جودة واحدة بمعزل. | الفئة | السطح | | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `/codeql-critical-quality/core-auth-secrets` | المصادقة، والأسرار، وبيئة العزل، وcron، وكود حدود أمان Gateway | +| `/codeql-critical-quality/core-auth-secrets` | المصادقة، والأسرار، وبيئة العزل، وCron، وكود حدود أمان Gateway | | `/codeql-critical-quality/config-boundary` | مخطط الإعدادات، والترحيل، والتطبيع، وعقود الإدخال/الإخراج | -| `/codeql-critical-quality/gateway-runtime-boundary` | مخططات بروتوكول Gateway وعقود طرائق الخادم | -| `/codeql-critical-quality/channel-runtime-boundary` | عقود تنفيذ القنوات الأساسية وPlugin القنوات المجمعة | -| `/codeql-critical-quality/agent-runtime-boundary` | تنفيذ الأوامر، وتوجيه النماذج/الموفرين، وتوجيه الرد التلقائي والطوابير، وعقود وقت تشغيل مستوى تحكم ACP | +| `/codeql-critical-quality/gateway-runtime-boundary` | مخططات بروتوكول Gateway وعقود أساليب الخادم | +| `/codeql-critical-quality/channel-runtime-boundary` | عقود تنفيذ القنوات الأساسية وPlugin القناة المضمّنة | +| `/codeql-critical-quality/agent-runtime-boundary` | تنفيذ الأوامر، وتوجيه النموذج/المزوّد، وتوجيه الرد التلقائي والطوابير، وعقود وقت تشغيل مستوى تحكم ACP | | `/codeql-critical-quality/mcp-process-runtime-boundary` | خوادم MCP وجسور الأدوات، ومساعدات الإشراف على العمليات، وعقود التسليم الصادر | -| `/codeql-critical-quality/memory-runtime-boundary` | Memory host SDK، وواجهات وقت تشغيل الذاكرة، وأسماء SDK المستعارة لذاكرة Plugin، وطبقة ربط تفعيل وقت تشغيل الذاكرة، وأوامر طبيب الذاكرة | -| `/codeql-critical-quality/session-diagnostics-boundary` | الأجزاء الداخلية لطابور الردود، وطوابير تسليم الجلسات، ومساعدات ربط/تسليم الجلسات الصادرة، وأسطح حزم أحداث/سجلات التشخيص، وعقود CLI لطبيب الجلسات | -| `/codeql-critical-quality/plugin-sdk-reply-runtime` | توجيه الردود الواردة في Plugin SDK، ومساعدات حمولة الرد/تقسيمها إلى مقاطع/وقت التشغيل، وخيارات رد القناة، وطوابير التسليم، ومساعدات ربط الجلسات/السلاسل | -| `/codeql-critical-quality/provider-runtime-boundary` | تطبيع فهرس النماذج، ومصادقة الموفرين واكتشافهم، وتسجيل وقت تشغيل الموفرين، وافتراضات/فهارس الموفرين، وسجلات الويب/البحث/الجلب/التضمين | -| `/codeql-critical-quality/ui-control-plane` | تهيئة واجهة التحكم، والاستمرارية المحلية، وتدفقات تحكم Gateway، وعقود وقت تشغيل مستوى تحكم المهام | -| `/codeql-critical-quality/web-media-runtime-boundary` | عقود وقت التشغيل لجلب/بحث الويب الأساسي، وإدخال/إخراج الوسائط، وفهم الوسائط، وتوليد الصور، وتوليد الوسائط | -| `/codeql-critical-quality/plugin-boundary` | عقود المحمل، والسجل، والسطح العام، ونقطة دخول Plugin SDK | -| `/codeql-critical-quality/plugin-sdk-package-contract` | مصدر Plugin SDK المنشور من جهة الحزمة ومساعدات عقود حزم Plugin | +| `/codeql-critical-quality/memory-runtime-boundary` | SDK مضيف الذاكرة، وواجهات وقت تشغيل الذاكرة، وأسماء Plugin SDK المستعارة للذاكرة، ووصلة تفعيل وقت تشغيل الذاكرة، وأوامر طبيب الذاكرة | +| `/codeql-critical-quality/session-diagnostics-boundary` | تفاصيل طابور الرد الداخلية، وطوابير تسليم الجلسات، ومساعدات ربط/تسليم الجلسات الصادرة، وأسطح حزم أحداث/سجلات التشخيص، وعقود CLI لطبيب الجلسات | +| `/codeql-critical-quality/plugin-sdk-reply-runtime` | توجيه الردود الواردة في Plugin SDK، ومساعدات حمولة الرد/تجزئته/وقت تشغيله، وخيارات رد القناة، وطوابير التسليم، ومساعدات ربط الجلسات/الخيوط | +| `/codeql-critical-quality/provider-runtime-boundary` | تطبيع كتالوج النماذج، ومصادقة المزوّد واكتشافه، وتسجيل وقت تشغيل المزوّد، وافتراضات/كتالوجات المزوّد، وسجلات الويب/البحث/الجلب/التضمين | +| `/codeql-critical-quality/ui-control-plane` | تمهيد واجهة التحكم، والاستمرارية المحلية، وتدفقات تحكم Gateway، وعقود وقت تشغيل مستوى تحكم المهام | +| `/codeql-critical-quality/web-media-runtime-boundary` | جلب/بحث الويب الأساسي، وإدخال/إخراج الوسائط، وفهم الوسائط، وتوليد الصور، وعقود وقت تشغيل توليد الوسائط | +| `/codeql-critical-quality/plugin-boundary` | عقود المُحمّل، والسجل، والسطح العام، ونقطة دخول Plugin SDK | +| `/codeql-critical-quality/plugin-sdk-package-contract` | مصدر Plugin SDK المنشور من جانب الحزمة ومساعدات عقد حزمة Plugin | -تبقى الجودة منفصلة عن الأمان حتى يمكن جدولة نتائج الجودة أو قياسها أو تعطيلها أو توسيعها دون حجب إشارة الأمان. يجب إعادة إضافة توسيع CodeQL الخاص بـ Swift وPython وPlugin المجمعة كعمل متابعة محدود النطاق أو مقسم فقط بعد أن تستقر الملفات الشخصية الضيقة من حيث وقت التشغيل والإشارة. +تبقى الجودة منفصلة عن الأمان بحيث يمكن جدولة نتائج الجودة أو قياسها أو تعطيلها أو توسيعها دون إخفاء إشارة الأمان. يجب إعادة إضافة توسعة CodeQL الخاصة بـ Swift وPython وPlugin المضمّنة كعمل متابعة محدود النطاق أو مجزأ فقط بعد أن تستقر الملفات الشخصية الضيقة في وقت التشغيل والإشارة. ## سير عمل الصيانة -### Docs Agent +### وكيل المستندات -سير عمل `Docs Agent` هو مسار صيانة Codex مدفوع بالأحداث للحفاظ على توافق الوثائق الحالية مع التغييرات التي هبطت مؤخرًا. لا يملك جدولًا زمنيًا خالصًا: يمكن لتشغيل CI ناجح بدفعة غير آلية على `main` أن يشغله، ويمكن للتشغيل اليدوي تشغيله مباشرة. تتخطى استدعاءات تشغيل سير العمل عندما يكون `main` قد تقدم أو عندما يكون تشغيل آخر غير متخطى لـ Docs Agent قد أُنشئ خلال الساعة الماضية. عند تشغيله، يراجع نطاق الالتزامات من SHA المصدر السابق غير المتخطى لـ Docs Agent إلى `main` الحالي، لذا يمكن لتشغيل واحد كل ساعة أن يغطي كل تغييرات main المتراكمة منذ آخر تمرير للوثائق. +سير عمل `Docs Agent` هو مسار صيانة Codex مدفوع بالأحداث لإبقاء المستندات الحالية متوافقة مع التغييرات التي وصلت مؤخرًا. ليس له جدول صرف: يمكن لتشغيل CI ناجح من دفع غير آلي على `main` أن يفعّله، ويمكن للتشغيل اليدوي تشغيله مباشرة. تتخطى استدعاءات تشغيل سير العمل عندما يكون `main` قد تقدّم أو عندما يكون تشغيل آخر غير متخطى لـ Docs Agent قد أُنشئ في الساعة الأخيرة. عند تشغيله، يراجع نطاق الالتزام من SHA مصدر Docs Agent السابق غير المتخطى إلى `main` الحالي، بحيث يمكن لتشغيل واحد كل ساعة أن يغطي كل تغييرات main المتراكمة منذ آخر مرور على المستندات. -### Test Performance Agent +### وكيل أداء الاختبارات -سير عمل `Test Performance Agent` هو مسار صيانة Codex مدفوع بالأحداث للاختبارات البطيئة. لا يملك جدولًا زمنيًا خالصًا: يمكن لتشغيل CI ناجح بدفعة غير آلية على `main` أن يشغله، لكنه يتخطى إذا كان استدعاء تشغيل سير عمل آخر قد شُغّل أو قيد التشغيل في ذلك اليوم بتوقيت UTC. يتجاوز التشغيل اليدوي بوابة النشاط اليومية تلك. ينشئ المسار تقرير أداء Vitest مجمعًا للمجموعة الكاملة، ويسمح لـ Codex بإجراء إصلاحات أداء اختبار صغيرة تحافظ على التغطية فقط بدلًا من إعادة هيكلة واسعة، ثم يعيد تشغيل تقرير المجموعة الكاملة ويرفض التغييرات التي تقلل عدد اختبارات خط الأساس الناجحة. إذا كان لدى خط الأساس اختبارات فاشلة، يمكن لـ Codex إصلاح الإخفاقات الواضحة فقط، ويجب أن ينجح تقرير المجموعة الكاملة بعد الوكيل قبل الالتزام بأي شيء. عندما يتقدم `main` قبل هبوط دفعة البوت، يعيد المسار بناء التصحيح المتحقق منه فوقه، ويعيد تشغيل `pnpm check:changed`، ويحاول الدفع مجددًا؛ ويتم تخطي التصحيحات القديمة المتعارضة. يستخدم Ubuntu المستضاف على GitHub حتى يتمكن إجراء Codex من الحفاظ على وضع أمان إسقاط sudo نفسه مثل وكيل الوثائق. +سير عمل `Test Performance Agent` هو مسار صيانة Codex مدفوع بالأحداث للاختبارات البطيئة. ليس له جدول صرف: يمكن لتشغيل CI ناجح من دفع غير آلي على `main` أن يفعّله، لكنه يتخطى إذا كان استدعاء تشغيل سير عمل آخر قد عمل بالفعل أو يعمل في ذلك اليوم بتوقيت UTC. يتجاوز التشغيل اليدوي بوابة النشاط اليومية تلك. يبني المسار تقرير أداء Vitest مجمّعًا للمجموعة الكاملة، ويسمح لـ Codex بإجراء إصلاحات صغيرة فقط لأداء الاختبارات مع الحفاظ على التغطية بدلًا من إعادة هيكلة واسعة، ثم يعيد تشغيل تقرير المجموعة الكاملة ويرفض التغييرات التي تقلل عدد اختبارات خط الأساس الناجحة. إذا كان في خط الأساس اختبارات فاشلة، يجوز لـ Codex إصلاح الإخفاقات الواضحة فقط، ويجب أن ينجح تقرير المجموعة الكاملة بعد الوكيل قبل الالتزام بأي شيء. عندما يتقدم `main` قبل وصول دفع الروبوت، يعيد المسار إسناد التصحيح المتحقق منه، ويعيد تشغيل `pnpm check:changed`، ويعيد محاولة الدفع؛ ويتم تخطي التصحيحات القديمة المتعارضة. يستخدم Ubuntu المستضاف على GitHub حتى يتمكن إجراء Codex من الحفاظ على وضع أمان إسقاط sudo نفسه مثل وكيل المستندات. -### PRs مكررة بعد الدمج +### طلبات PR المكررة بعد الدمج -سير عمل `Duplicate PRs After Merge` هو سير عمل يدوي للمشرفين لتنظيف التكرارات بعد الهبوط. افتراضيًا يعمل كتجربة جافة ولا يغلق إلا PRs المدرجة صراحة عندما تكون `apply=true`. قبل تعديل GitHub، يتحقق من أن PR الذي هبط مدمج وأن كل تكرار لديه إما مشكلة مرجعية مشتركة أو مقاطع تغييرات متداخلة. +سير عمل `Duplicate PRs After Merge` هو سير عمل يدوي للمشرفين لتنظيف التكرارات بعد الوصول. يستخدم افتراضيًا التشغيل الجاف ولا يغلق إلا طلبات PR المدرجة صراحة عندما تكون `apply=true`. قبل تعديل GitHub، يتحقق من أن طلب PR الذي وصل مدمج وأن كل تكرار لديه إما مشكلة مرجعية مشتركة أو مقاطع تغييرات متداخلة. ```bash gh workflow run duplicate-after-merge.yml \ @@ -392,29 +392,29 @@ gh workflow run duplicate-after-merge.yml \ -f apply=true ``` -## بوابات الفحص المحلية وتوجيه التغييرات +## بوابات الفحص المحلي وتوجيه التغييرات -تعيش منطقية مسارات التغييرات المحلية في `scripts/changed-lanes.mjs` وتنفذها `scripts/check-changed.mjs`. بوابة الفحص المحلية هذه أكثر صرامة بشأن حدود المعمارية من نطاق منصة CI الواسع: +توجد منطقية مسارات التغييرات المحلية في `scripts/changed-lanes.mjs` وتُنفذ بواسطة `scripts/check-changed.mjs`. بوابة الفحص المحلي هذه أكثر صرامة بشأن حدود البنية من نطاق منصة CI الواسع: -- تشغّل تغييرات الإنتاج الأساسية فحص أنواع إنتاج النواة واختبار النواة إضافة إلى فحص lint/الحراس للنواة؛ -- تشغّل تغييرات الاختبارات الأساسية فقط فحص أنواع اختبار النواة إضافة إلى فحص lint للنواة؛ -- تشغّل تغييرات إنتاج الإضافات فحص أنواع إنتاج الإضافة واختبار الإضافة إضافة إلى فحص lint للإضافة؛ -- تشغّل تغييرات اختبارات الإضافات فقط فحص أنواع اختبار الإضافة إضافة إلى فحص lint للإضافة؛ -- تتوسع تغييرات Plugin SDK العامة أو عقود Plugin إلى فحص أنواع الإضافات لأن الإضافات تعتمد على عقود النواة هذه (تبقى عمليات مسح امتدادات Vitest عمل اختبار صريحًا)؛ -- تشغّل زيادات الإصدار الخاصة ببيانات الإصدار فقط فحوصات موجّهة للإصدار/الإعدادات/اعتماديات الجذر؛ -- تفشل تغييرات الجذر/الإعدادات غير المعروفة بأمان إلى كل مسارات الفحص. +- تغييرات الإنتاج الأساسية تشغّل فحص أنواع إنتاج الأساس واختباراته بالإضافة إلى فحص الأنماط/الحراس الأساسية؛ +- تغييرات الاختبارات الأساسية فقط تشغّل فقط فحص أنواع الاختبارات الأساسية بالإضافة إلى فحص الأنماط الأساسي؛ +- تغييرات إنتاج الإضافة تشغّل فحص أنواع إنتاج الإضافة واختباراتها بالإضافة إلى فحص أنماط الإضافة؛ +- تغييرات اختبارات الإضافة فقط تشغّل فحص أنواع اختبارات الإضافة بالإضافة إلى فحص أنماط الإضافة؛ +- تغييرات Plugin SDK العامة أو عقد Plugin تتوسع إلى فحص أنواع الإضافات لأن الإضافات تعتمد على تلك العقود الأساسية (تبقى عمليات مسح إضافات Vitest عمل اختبار صريحًا)؛ +- زيادات الإصدارات الخاصة ببيانات الإصدار الوصفية فقط تشغّل فحوصات مستهدفة للإصدار/الإعدادات/اعتماديات الجذر؛ +- تغييرات الجذر/الإعدادات غير المعروفة تفشل بأمان إلى جميع مسارات الفحص. -يعيش توجيه الاختبارات المحلية المتغيرة في `scripts/test-projects.test-support.mjs` وهو أرخص عمدًا من `check:changed`: تعديلات الاختبارات المباشرة تشغّل نفسها، وتفضل تعديلات المصدر الخرائط الصريحة، ثم اختبارات الأشقاء والتابعين في مخطط الاستيراد. إعداد تسليم غرف المجموعات المشتركة هو أحد الخرائط الصريحة: تمر التغييرات في إعداد الرد المرئي للمجموعة، أو وضع تسليم رد المصدر، أو مسار موجه النظام لأداة الرسائل عبر اختبارات الرد الأساسية إضافة إلى انحدارات تسليم Discord وSlack بحيث يفشل تغيير افتراضي مشترك قبل أول دفع PR. استخدم `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` فقط عندما يكون التغيير واسعًا على مستوى عدة الاختبار بما يكفي لأن المجموعة الرخيصة المعينة ليست بديلًا موثوقًا. +يوجد توجيه الاختبارات المحلية المتغيرة في `scripts/test-projects.test-support.mjs` وهو أرخص عمدًا من `check:changed`: تعديلات الاختبارات المباشرة تشغّل نفسها، وتفضّل تعديلات المصدر الخرائط الصريحة، ثم الاختبارات الشقيقة والمعتمدين عبر مخطط الاستيراد. إعداد تسليم غرفة المجموعة المشتركة أحد الخرائط الصريحة: تغييرات إعداد الرد المرئي للمجموعة، أو وضع تسليم رد المصدر، أو موجّه النظام لأداة الرسائل تمر عبر اختبارات الرد الأساسية بالإضافة إلى انحدارات تسليم Discord وSlack حتى يفشل تغيير افتراضي مشترك قبل أول دفع PR. استخدم `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` فقط عندما يكون التغيير واسعًا على مستوى الحاضنة بما يكفي بحيث لا تكون المجموعة الرخيصة المرسومة وكيلًا موثوقًا. -## التحقق عبر Testbox +## تحقق Testbox -شغّل Testbox من جذر المستودع وفضّل صندوقًا جديدًا دافئًا لإثبات واسع. قبل إنفاق بوابة بطيئة على صندوق أُعيد استخدامه أو انتهت صلاحيته أو أبلغ للتو عن مزامنة كبيرة على نحو غير متوقع، شغّل `pnpm testbox:sanity` داخل الصندوق أولًا. +شغّل Testbox من جذر المستودع وفضّل صندوقًا جديدًا مُسخّنًا لإثبات واسع. قبل صرف بوابة بطيئة على صندوق أُعيد استخدامه أو انتهت صلاحيته أو أبلغ للتو عن مزامنة كبيرة على نحو غير متوقع، شغّل `pnpm testbox:sanity` داخل الصندوق أولًا. -يفشل فحص السلامة بسرعة عندما تختفي ملفات الجذر المطلوبة مثل `pnpm-lock.yaml` أو عندما يعرض `git status --short` ما لا يقل عن 200 حذف متتبع. يعني ذلك عادة أن حالة المزامنة البعيدة ليست نسخة موثوقة من PR؛ أوقف ذلك الصندوق وجهّز صندوقًا جديدًا بدلًا من تصحيح فشل اختبار المنتج. بالنسبة إلى PRs ذات الحذف الكبير المتعمد، عيّن `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` لتشغيل السلامة ذلك. +يفشل فحص السلامة بسرعة عندما تختفي ملفات الجذر المطلوبة مثل `pnpm-lock.yaml` أو عندما يعرض `git status --short` ما لا يقل عن 200 حذف متتبّع. يعني ذلك عادة أن حالة المزامنة البعيدة ليست نسخة موثوقة من طلب PR؛ أوقف ذلك الصندوق وسخّن صندوقًا جديدًا بدلًا من تصحيح فشل اختبار المنتج. لطلبات PR ذات الحذف الكبير المتعمّد، عيّن `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` لذلك تشغيل السلامة. -ينهي `pnpm testbox:run` أيضًا استدعاء Blacksmith CLI محليًا يبقى في مرحلة المزامنة لأكثر من خمس دقائق دون مخرجات بعد المزامنة. عيّن `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` لتعطيل ذلك الحارس، أو استخدم قيمة أكبر بالمللي ثانية للفروقات المحلية الكبيرة على نحو غير معتاد. +ينهي `pnpm testbox:run` أيضًا استدعاء Blacksmith CLI محليًا يبقى في مرحلة المزامنة لأكثر من خمس دقائق دون إخراج بعد المزامنة. عيّن `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` لتعطيل ذلك الحارس، أو استخدم قيمة أكبر بالميلي ثانية للفروق المحلية الكبيرة على نحو غير معتاد. -## ذات صلة +## ذو صلة - [نظرة عامة على التثبيت](/ar/install) - [قنوات التطوير](/ar/install/development-channels) diff --git a/docs/ar/concepts/agent-loop.md b/docs/ar/concepts/agent-loop.md index 673d86ed8..d75eb34f2 100644 --- a/docs/ar/concepts/agent-loop.md +++ b/docs/ar/concepts/agent-loop.md @@ -1,48 +1,49 @@ --- read_when: - تحتاج إلى شرح تفصيلي دقيق لحلقة الوكيل أو أحداث دورة الحياة - - أنت تغيّر وضع الجلسات في قائمة الانتظار، أو عمليات كتابة السجل النصي، أو سلوك قفل الكتابة للجلسة + - أنت تغيّر آلية اصطفاف الجلسات، أو عمليات كتابة السجل النصي، أو سلوك قفل كتابة الجلسة summary: دورة حياة حلقة الوكيل، والتدفقات، ودلالات الانتظار title: حلقة الوكيل x-i18n: - generated_at: "2026-04-30T07:51:14Z" + generated_at: "2026-04-30T18:38:49Z" model: gpt-5.5 provider: openai - source_hash: 902d543bd71dd517a810d825cbe92e244fe89230f47eeada72477c657a2bec32 + source_hash: 5466893253e1f82482284ff82db56f4c3fca018bf12e4114fad76d37cad954df source_path: concepts/agent-loop.md workflow: 16 --- -حلقة الوكيل هي التشغيل "الحقيقي" الكامل للوكيل: الاستقبال ← تجميع السياق ← استدلال النموذج ← -تنفيذ الأدوات ← الردود المتدفقة ← الحفظ. وهي المسار الموثوق الذي يحوّل رسالة +حلقة الوكيلية هي التشغيل الكامل "الحقيقي" للوكيل: الإدخال → تجميع السياق → استدلال النموذج → +تنفيذ الأدوات → بث الردود → الاستمرارية. وهي المسار الموثوق الذي يحوّل الرسالة إلى إجراءات ورد نهائي، مع الحفاظ على اتساق حالة الجلسة. -في OpenClaw، تكون الحلقة تشغيلاً واحداً ومتسلسلاً لكل جلسة، وتُصدر أحداث دورة الحياة والتدفق -أثناء تفكير النموذج واستدعائه للأدوات وبثه للمخرجات. يشرح هذا المستند كيف تُوصَل تلك الحلقة الأصيلة +في OpenClaw، الحلقة هي تشغيل واحد ومتسلسل لكل جلسة، يصدر أحداث دورة الحياة والبث +بينما يفكر النموذج، ويستدعي الأدوات، ويبث المخرجات. يشرح هذا المستند كيف تُوصَل تلك الحلقة الأصيلة من البداية إلى النهاية. ## نقاط الدخول -- Gateway RPC: `agent` و`agent.wait`. +- Gateway RPC: `agent` و `agent.wait`. - CLI: أمر `agent`. -## كيف يعمل (على مستوى عال) +## كيف يعمل ذلك (نظرة عامة) -1. يتحقق `agent` RPC من المعاملات، ويحل الجلسة (sessionKey/sessionId)، ويحفظ بيانات تعريف الجلسة، ثم يعيد `{ runId, acceptedAt }` فوراً. -2. يشغّل `agentCommand` الوكيل: - - يحل النموذج + الإعدادات الافتراضية للتفكير/الإسهاب/التتبع +1. يتحقق `agent` RPC من المعاملات، ويحل الجلسة (sessionKey/sessionId)، ويحفظ بيانات تعريف الجلسة، ويعيد `{ runId, acceptedAt }` فورًا. +2. يشغل `agentCommand` الوكيل: + - يحل النموذج + افتراضيات التفكير/الإسهاب/التتبع - يحمّل لقطة Skills - يستدعي `runEmbeddedPiAgent` (وقت تشغيل pi-agent-core) - - يصدر **نهاية/خطأ دورة الحياة** إذا لم تُصدر الحلقة المضمنة واحداً -3. `runEmbeddedPiAgent`: + - يصدر **نهاية/خطأ دورة الحياة** إذا لم تصدر الحلقة المضمنة واحدًا +3. يقوم `runEmbeddedPiAgent` بما يلي: - يسلسل عمليات التشغيل عبر طوابير لكل جلسة + طوابير عامة - يحل النموذج + ملف تعريف المصادقة ويبني جلسة pi - - يشترك في أحداث pi ويبث فروقات المساعد/الأداة - - يفرض المهلة -> يجهض التشغيل عند تجاوزها + - يشترك في أحداث pi ويبث دلتا المساعد/الأداة + - يفرض المهلة -> يلغي التشغيل إذا تم تجاوزها + - بالنسبة إلى أدوار خادم تطبيق Codex، يلغي الدور المقبول الذي يتوقف عن إنتاج تقدم خادم التطبيق قبل حدث نهائي - يعيد الحمولات + بيانات تعريف الاستخدام -4. يربط `subscribeEmbeddedPiSession` أحداث pi-agent-core بتدفق `agent` في OpenClaw: - - أحداث الأدوات => `stream: "tool"` - - فروقات المساعد => `stream: "assistant"` +4. يربط `subscribeEmbeddedPiSession` أحداث pi-agent-core ببث `agent` في OpenClaw: + - أحداث الأداة => `stream: "tool"` + - دلتا المساعد => `stream: "assistant"` - أحداث دورة الحياة => `stream: "lifecycle"` (`phase: "start" | "end" | "error"`) 5. يستخدم `agent.wait` الدالة `waitForAgentRun`: - ينتظر **نهاية/خطأ دورة الحياة** لـ `runId` @@ -50,133 +51,133 @@ x-i18n: ## الطوابير + التزامن -- تُسلسل عمليات التشغيل لكل مفتاح جلسة (مسار الجلسة) واختيارياً عبر مسار عام. +- تُسلسل عمليات التشغيل لكل مفتاح جلسة (مسار الجلسة)، واختياريًا عبر مسار عام. - يمنع هذا تعارضات الأدوات/الجلسات ويحافظ على اتساق سجل الجلسة. - يمكن لقنوات المراسلة اختيار أوضاع الطابور (collect/steer/followup) التي تغذي نظام المسارات هذا. راجع [طابور الأوامر](/ar/concepts/queue). -- كما تُحمى كتابات النصوص أيضاً بقفل كتابة جلسة على ملف الجلسة. القفل - واع بالعملية وقائم على الملفات، لذا يلتقط الكتّاب الذين يتجاوزون الطابور داخل العملية أو يأتون من +- تُحمى كتابات النص المنسوخ أيضًا بقفل كتابة جلسة على ملف الجلسة. القفل + مدرك للعمليات وقائم على الملفات، لذلك يلتقط الكتّاب الذين يتجاوزون الطابور داخل العملية أو يأتون من عملية أخرى. -- أقفال كتابة الجلسة غير قابلة لإعادة الدخول افتراضياً. إذا كان مساعد ما يضمّن عمداً الحصول على - القفل نفسه مع الحفاظ على كاتب منطقي واحد، فيجب أن يشترك صراحة باستخدام +- أقفال كتابة الجلسة غير قابلة لإعادة الدخول افتراضيًا. إذا كان مساعد ما يتداخل عمدًا في الحصول على + القفل نفسه مع الحفاظ على كاتب منطقي واحد، فيجب أن يفعّل ذلك صراحةً باستخدام `allowReentrant: true`. ## إعداد الجلسة + مساحة العمل - تُحل مساحة العمل وتُنشأ؛ وقد تعيد عمليات التشغيل المعزولة توجيهها إلى جذر مساحة عمل معزولة. -- تُحمّل Skills (أو يُعاد استخدامها من لقطة) وتُحقن في البيئة والمطالبة. -- تُحل ملفات التمهيد/السياق وتُحقن في تقرير مطالبة النظام. -- يُكتسب قفل كتابة الجلسة؛ ويُفتح `SessionManager` ويُجهز قبل البث. يجب على أي - مسار لاحق لإعادة كتابة النص، أو Compaction، أو الاقتطاع أخذ القفل نفسه قبل فتح ملف النص أو - تعديله. +- تُحمّل Skills (أو يعاد استخدامها من لقطة) وتُحقن في البيئة والموجه. +- تُحل ملفات bootstrap/السياق وتُحقن في تقرير موجه النظام. +- يُكتسب قفل كتابة جلسة؛ ويُفتح `SessionManager` ويُجهز قبل البث. يجب على أي + مسار لاحق لإعادة كتابة النص المنسوخ أو Compaction أو الاقتطاع أن يأخذ القفل نفسه قبل فتح + ملف النص المنسوخ أو تعديله. -## تجميع المطالبة + مطالبة النظام +## تجميع الموجه + موجه النظام -- تُبنى مطالبة النظام من مطالبة OpenClaw الأساسية، ومطالبة Skills، وسياق التمهيد، والتجاوزات الخاصة بكل تشغيل. -- تُفرض حدود خاصة بالنموذج ورموز احتياط Compaction. -- راجع [مطالبة النظام](/ar/concepts/system-prompt) لمعرفة ما يراه النموذج. +- يُبنى موجه النظام من الموجه الأساسي في OpenClaw، وموجه Skills، وسياق bootstrap، والتجاوزات الخاصة بكل تشغيل. +- تُفرض حدود النموذج المحددة ورموز احتياطي Compaction. +- راجع [موجه النظام](/ar/concepts/system-prompt) لمعرفة ما يراه النموذج. -## نقاط الربط (حيث يمكنك الاعتراض) +## نقاط الخطاف (حيث يمكنك الاعتراض) -لدى OpenClaw نظاما ربط: +لدى OpenClaw نظاما خطافات: -- **الربط الداخلي** (ربط Gateway): سكربتات مدفوعة بالأحداث للأوامر وأحداث دورة الحياة. -- **ربط Plugin**: نقاط توسعة داخل دورة حياة الوكيل/الأداة وخط أنابيب Gateway. +- **الخطافات الداخلية** (خطافات Gateway): سكربتات مدفوعة بالأحداث للأوامر وأحداث دورة الحياة. +- **خطافات Plugin**: نقاط توسعة داخل دورة حياة الوكيل/الأداة وخط أنابيب Gateway. -### الربط الداخلي (ربط Gateway) +### الخطافات الداخلية (خطافات Gateway) -- **`agent:bootstrap`**: يعمل أثناء بناء ملفات التمهيد قبل إنهاء مطالبة النظام. - استخدمه لإضافة/إزالة ملفات سياق التمهيد. -- **ربط الأوامر**: `/new` و`/reset` و`/stop` وأحداث أوامر أخرى (راجع مستند الربط). +- **`agent:bootstrap`**: يعمل أثناء بناء ملفات bootstrap قبل إنهاء موجه النظام. + استخدم هذا لإضافة/إزالة ملفات سياق bootstrap. +- **خطافات الأوامر**: `/new`، و`/reset`، و`/stop`، وأحداث أوامر أخرى (راجع مستند الخطافات). -راجع [الربط](/ar/automation/hooks) للإعداد والأمثلة. +راجع [الخطافات](/ar/automation/hooks) للإعداد والأمثلة. -### ربط Plugin (دورة حياة الوكيل + Gateway) +### خطافات Plugin (دورة حياة الوكيل + Gateway) تعمل هذه داخل حلقة الوكيل أو خط أنابيب Gateway: -- **`before_model_resolve`**: يعمل قبل الجلسة (بدون `messages`) لتجاوز المزوّد/النموذج بشكل حتمي قبل حل النموذج. -- **`before_prompt_build`**: يعمل بعد تحميل الجلسة (مع `messages`) لحقن `prependContext` أو `systemPrompt` أو `prependSystemContext` أو `appendSystemContext` قبل إرسال المطالبة. استخدم `prependContext` للنص الديناميكي لكل دور، وحقول سياق النظام للإرشادات الثابتة التي يجب أن تكون في مساحة مطالبة النظام. -- **`before_agent_start`**: ربط توافق قديم قد يعمل في أي من المرحلتين؛ فضّل الربط الصريح أعلاه. -- **`before_agent_reply`**: يعمل بعد الإجراءات المضمنة وقبل استدعاء LLM، مما يتيح لـ Plugin امتلاك الدور وإرجاع رد اصطناعي أو إسكات الدور بالكامل. -- **`agent_end`**: افحص قائمة الرسائل النهائية وبيانات تعريف التشغيل بعد الاكتمال. -- **`before_compaction` / `after_compaction`**: راقب دورات Compaction أو أضف تعليقات توضيحية إليها. -- **`before_tool_call` / `after_tool_call`**: اعترض معاملات/نتائج الأدوات. -- **`before_install`**: افحص نتائج الفحص المدمجة واختيارياً احظر تثبيت Skills أو Plugin. -- **`tool_result_persist`**: حوّل نتائج الأدوات بشكل متزامن قبل كتابتها في نص جلسة مملوك لـ OpenClaw. -- **`message_received` / `message_sending` / `message_sent`**: ربط الرسائل الواردة + الصادرة. +- **`before_model_resolve`**: يعمل قبل الجلسة (بلا `messages`) لتجاوز المزود/النموذج بشكل حتمي قبل حل النموذج. +- **`before_prompt_build`**: يعمل بعد تحميل الجلسة (مع `messages`) لحقن `prependContext` أو `systemPrompt` أو `prependSystemContext` أو `appendSystemContext` قبل إرسال الموجه. استخدم `prependContext` للنص الديناميكي لكل دور، وحقول سياق النظام للإرشادات المستقرة التي يجب أن تقع في مساحة موجه النظام. +- **`before_agent_start`**: خطاف توافق قديم قد يعمل في أي من المرحلتين؛ فضّل الخطافات الصريحة أعلاه. +- **`before_agent_reply`**: يعمل بعد الإجراءات المضمنة وقبل استدعاء LLM، مما يتيح لـ Plugin المطالبة بالدور وإرجاع رد اصطناعي أو إسكات الدور بالكامل. +- **`agent_end`**: يفحص قائمة الرسائل النهائية وبيانات تعريف التشغيل بعد الاكتمال. +- **`before_compaction` / `after_compaction`**: يراقب دورات Compaction أو يعلق عليها. +- **`before_tool_call` / `after_tool_call`**: يعترض معاملات/نتائج الأدوات. +- **`before_install`**: يفحص نتائج الفحص المدمجة ويمكنه اختياريًا حظر تثبيت Skills أو Plugins. +- **`tool_result_persist`**: يحوّل نتائج الأدوات بشكل متزامن قبل كتابتها إلى نص جلسة منسوخ مملوك لـ OpenClaw. +- **`message_received` / `message_sending` / `message_sent`**: خطافات الرسائل الواردة + الصادرة. - **`session_start` / `session_end`**: حدود دورة حياة الجلسة. - **`gateway_start` / `gateway_stop`**: أحداث دورة حياة Gateway. -قواعد قرار الربط لحراس الصادر/الأداة: +قواعد قرارات الخطافات لحراس الإرسال/الأدوات: -- `before_tool_call`: تكون `{ block: true }` نهائية وتوقف المعالجات ذات الأولوية الأدنى. -- `before_tool_call`: تكون `{ block: false }` بلا تأثير ولا تزيل حظراً سابقاً. -- `before_install`: تكون `{ block: true }` نهائية وتوقف المعالجات ذات الأولوية الأدنى. -- `before_install`: تكون `{ block: false }` بلا تأثير ولا تزيل حظراً سابقاً. -- `message_sending`: تكون `{ cancel: true }` نهائية وتوقف المعالجات ذات الأولوية الأدنى. -- `message_sending`: تكون `{ cancel: false }` بلا تأثير ولا تزيل إلغاء سابقاً. +- `before_tool_call`: يكون `{ block: true }` نهائيًا ويوقف المعالجات ذات الأولوية الأدنى. +- `before_tool_call`: يكون `{ block: false }` بلا أثر ولا يمحو حظرًا سابقًا. +- `before_install`: يكون `{ block: true }` نهائيًا ويوقف المعالجات ذات الأولوية الأدنى. +- `before_install`: يكون `{ block: false }` بلا أثر ولا يمحو حظرًا سابقًا. +- `message_sending`: يكون `{ cancel: true }` نهائيًا ويوقف المعالجات ذات الأولوية الأدنى. +- `message_sending`: يكون `{ cancel: false }` بلا أثر ولا يمحو إلغاءً سابقًا. -راجع [ربط Plugin](/ar/plugins/hooks) لتفاصيل واجهة API للربط والتسجيل. +راجع [خطافات Plugin](/ar/plugins/hooks) لتفاصيل واجهة API للخطاف والتسجيل. -قد تكيّف الحاضنات هذا الربط بطرق مختلفة. تحافظ حاضنة خادم تطبيق Codex على -ربط Plugin في OpenClaw كعقد توافق للأسطح الموثقة المعكوسة، -بينما تظل ربطات Codex الأصلية آلية Codex منفصلة ذات مستوى أدنى. +قد تكيف الحاضنات هذه الخطافات بطرق مختلفة. تحافظ حاضنة خادم تطبيق Codex على +خطافات Plugin في OpenClaw باعتبارها عقد التوافق للأسطح المرآتية الموثقة، +بينما تظل خطافات Codex الأصلية آلية Codex منخفضة المستوى منفصلة. ## البث + الردود الجزئية -- تُبث فروقات المساعد من pi-agent-core وتُصدر كأحداث `assistant`. +- تُبث دلتا المساعد من pi-agent-core وتُصدر كأحداث `assistant`. - يمكن لبث الكتل إصدار ردود جزئية إما عند `text_end` أو `message_end`. -- يمكن إصدار بث الاستدلال كتدفق منفصل أو كردود كتل. -- راجع [البث](/ar/concepts/streaming) لسلوك التقسيم إلى أجزاء وردود الكتل. +- يمكن إصدار بث الاستدلال كبث منفصل أو كردود كتل. +- راجع [البث](/ar/concepts/streaming) لمعرفة سلوك التجزئة وردود الكتل. ## تنفيذ الأدوات + أدوات المراسلة -- تُصدر أحداث بدء/تحديث/انتهاء الأداة على تدفق `tool`. -- تُنظف نتائج الأدوات من حيث الحجم وحمولات الصور قبل التسجيل/الإصدار. -- تُتبع عمليات إرسال أدوات المراسلة لكبح تأكيدات المساعد المكررة. +- تُصدر أحداث بدء/تحديث/نهاية الأداة على بث `tool`. +- تُنقح نتائج الأدوات من حيث الحجم وحمولات الصور قبل التسجيل/الإصدار. +- تُتبع عمليات إرسال أدوات المراسلة لمنع تأكيدات المساعد المكررة. -## تشكيل الرد + الكبح +## تشكيل الرد + الكبت -- تُجمع الحمولات النهائية من: +- تُجمّع الحمولات النهائية من: - نص المساعد (والاستدلال الاختياري) - ملخصات الأدوات المضمنة (عند الإسهاب + السماح) - - نص خطأ المساعد عند حدوث خطأ في النموذج -- يُصفّى الرمز الصامت الدقيق `NO_REPLY` / `no_reply` من الحمولات + - نص خطأ المساعد عندما يخطئ النموذج +- تُرشح العلامة الصامتة الدقيقة `NO_REPLY` / `no_reply` من الحمولات الصادرة. - تُزال تكرارات أدوات المراسلة من قائمة الحمولات النهائية. -- إذا لم تبق أي حمولات قابلة للعرض وحدث خطأ في أداة، يُصدر رد خطأ أداة احتياطي - (ما لم تكن أداة مراسلة قد أرسلت بالفعل رداً مرئياً للمستخدم). +- إذا لم تبقَ أي حمولات قابلة للعرض وحدث خطأ في أداة، يُصدر رد احتياطي لخطأ الأداة + (ما لم تكن أداة مراسلة قد أرسلت بالفعل ردًا مرئيًا للمستخدم). -## Compaction + إعادة المحاولة +## Compaction + إعادة المحاولات -- يصدر Compaction التلقائي أحداث تدفق `compaction` ويمكنه تشغيل إعادة محاولة. -- عند إعادة المحاولة، تُعاد تعيين المخازن المؤقتة داخل الذاكرة وملخصات الأدوات لتجنب تكرار المخرجات. +- يصدر Compaction التلقائي أحداث بث `compaction` ويمكنه تشغيل إعادة محاولة. +- عند إعادة المحاولة، تُعاد تهيئة المخازن المؤقتة داخل الذاكرة وملخصات الأدوات لتجنب تكرار المخرجات. - راجع [Compaction](/ar/concepts/compaction) لمعرفة خط أنابيب Compaction. ## تدفقات الأحداث (اليوم) - `lifecycle`: يصدره `subscribeEmbeddedPiSession` (وكاحتياطي بواسطة `agentCommand`) -- `assistant`: فروقات متدفقة من pi-agent-core -- `tool`: أحداث أدوات متدفقة من pi-agent-core +- `assistant`: دلتا مبثوثة من pi-agent-core +- `tool`: أحداث أدوات مبثوثة من pi-agent-core -## معالجة قناة الدردشة +## معالجة قنوات الدردشة -- تُخزن فروقات المساعد مؤقتاً في رسائل دردشة `delta`. -- تُصدر دردشة `final` عند **نهاية/خطأ دورة الحياة**. +- تُخزن دلتا المساعد في رسائل `delta` للدردشة. +- تُصدر `final` للدردشة عند **نهاية/خطأ دورة الحياة**. -## المهلات +## المهل -- الافتراضي لـ `agent.wait`: 30 ثانية (الانتظار فقط). يتجاوزه معامل `timeoutMs`. -- وقت تشغيل الوكيل: الافتراضي لـ `agents.defaults.timeoutSeconds` هو 172800 ثانية (48 ساعة)؛ ويُفرض في مؤقت إجهاض `runEmbeddedPiAgent`. -- وقت تشغيل Cron: يملك Cron قيمة `timeoutSeconds` المعزولة لدور الوكيل. يبدأ المجدول ذلك المؤقت عند بدء التنفيذ، ويجهض التشغيل الأساسي عند الموعد النهائي المضبوط، ثم يجري تنظيفاً محدوداً قبل تسجيل المهلة بحيث لا تستطيع جلسة فرعية قديمة إبقاء المسار عالقاً. -- استرداد الجلسات العالقة: مع تمكين التشخيصات، يكتشف `diagnostics.stuckSessionWarnMs` الجلسات الطويلة ذات حالة `processing`. تظل عمليات التشغيل المضمنة النشطة، وعمليات الرد النشطة، ومهام مسار الجلسة النشطة تحذيرية فقط افتراضياً؛ وإذا أظهرت التشخيصات عدم وجود عمل نشط للجلسة، يحرر المراقب مسار الجلسة المتأثر لكي تُصرّف أعمال بدء التشغيل الموجودة في الطابور. -- مهلة خمول النموذج: يجهض OpenClaw طلب النموذج عندما لا تصل أجزاء استجابة قبل نافذة الخمول. يمدد `models.providers..timeoutSeconds` مراقب الخمول هذا للمزوّدين المحليين/المستضافين ذاتياً البطيئين؛ وإلا يستخدم OpenClaw `agents.defaults.timeoutSeconds` عند ضبطه، مع حد أقصى افتراضي قدره 120 ثانية. عمليات التشغيل المشغلة بواسطة Cron التي لا تحتوي على مهلة نموذج أو وكيل صريحة تعطل مراقب الخمول وتعتمد على مهلة Cron الخارجية. -- مهلة طلب HTTP للمزوّد: ينطبق `models.providers..timeoutSeconds` على عمليات جلب HTTP للنموذج الخاصة بذلك المزوّد، بما في ذلك الاتصال، والرؤوس، والجسم، ومهلة طلب SDK، ومعالجة إجهاض الجلب المحروس الإجمالية، ومراقب خمول تدفق النموذج. استخدم هذا للمزوّدين المحليين/المستضافين ذاتياً البطيئين مثل Ollama قبل رفع مهلة وقت تشغيل الوكيل بالكامل. +- افتراضي `agent.wait`: 30 ثانية (الانتظار فقط). يتجاوز معامل `timeoutMs` ذلك. +- وقت تشغيل الوكيل: افتراضي `agents.defaults.timeoutSeconds` هو 172800 ثانية (48 ساعة)؛ ويُفرض في مؤقت إلغاء `runEmbeddedPiAgent`. +- وقت تشغيل Cron: يملك Cron قيمة `timeoutSeconds` لدور الوكيل المعزول. يبدأ المجدول ذلك المؤقت عند بدء التنفيذ، ويلغي التشغيل الأساسي عند الموعد النهائي المهيأ، ثم يشغل تنظيفًا محدودًا قبل تسجيل انتهاء المهلة حتى لا تتمكن جلسة فرعية قديمة من إبقاء المسار عالقًا. +- استرداد الجلسة العالقة: عند تمكين التشخيصات، يكتشف `diagnostics.stuckSessionWarnMs` جلسات `processing` الطويلة. تظل عمليات التشغيل المضمنة النشطة، وعمليات الرد النشطة، ومهام مسار الجلسة النشطة تحذيرية فقط افتراضيًا؛ إذا أظهرت التشخيصات عدم وجود عمل نشط للجلسة، يحرر المراقب مسار الجلسة المتأثر حتى يمكن تصريف عمل بدء التشغيل في الطابور. +- مهلة خمول النموذج: يلغي OpenClaw طلب النموذج عندما لا تصل أي أجزاء استجابة قبل نافذة الخمول. يمدد `models.providers..timeoutSeconds` مراقب الخمول هذا للمزودين المحليين/ذاتيي الاستضافة البطيئين؛ وإلا يستخدم OpenClaw قيمة `agents.defaults.timeoutSeconds` عند تهيئتها، مع حد أقصى افتراضي 120 ثانية. تعمل عمليات التشغيل المشغلة بواسطة Cron بلا مهلة صريحة للنموذج أو الوكيل على تعطيل مراقب الخمول وتعتمد على مهلة Cron الخارجية. +- مهلة طلب HTTP للمزود: يطبق `models.providers..timeoutSeconds` على جلب HTTP للنموذج الخاص بذلك المزود، بما في ذلك الاتصال، والرؤوس، والجسم، ومهلة طلب SDK، ومعالجة الإلغاء الكلي لـ guarded-fetch، ومراقب خمول بث النموذج. استخدم هذا للمزودين المحليين/ذاتيي الاستضافة البطيئين مثل Ollama قبل رفع مهلة وقت تشغيل الوكيل بالكامل. -## أين يمكن أن تنتهي الأمور مبكراً +## أين يمكن أن تنتهي الأشياء مبكرًا -- مهلة الوكيل (إجهاض) +- مهلة الوكيل (إلغاء) - AbortSignal (إلغاء) - انقطاع Gateway أو مهلة RPC - مهلة `agent.wait` (انتظار فقط، لا توقف الوكيل) @@ -184,7 +185,7 @@ x-i18n: ## ذو صلة - [الأدوات](/ar/tools) — أدوات الوكيل المتاحة -- [الربط](/ar/automation/hooks) — سكربتات مدفوعة بالأحداث تُشغّلها أحداث دورة حياة الوكيل +- [الخطافات](/ar/automation/hooks) — سكربتات مدفوعة بالأحداث تُشغلها أحداث دورة حياة الوكيل - [Compaction](/ar/concepts/compaction) — كيف تُلخص المحادثات الطويلة -- [موافقات Exec](/ar/tools/exec-approvals) — بوابات الموافقة لأوامر الصدفة -- [التفكير](/ar/tools/thinking) — تكوين مستوى التفكير/الاستدلال +- [موافقات Exec](/ar/tools/exec-approvals) — بوابات الموافقة لأوامر shell +- [التفكير](/ar/tools/thinking) — تهيئة مستوى التفكير/الاستدلال diff --git a/docs/ar/concepts/queue.md b/docs/ar/concepts/queue.md index 57dc9327f..c8bc0371f 100644 --- a/docs/ar/concepts/queue.md +++ b/docs/ar/concepts/queue.md @@ -2,63 +2,63 @@ read_when: - تغيير تنفيذ الرد التلقائي أو التزامنه - شرح أوضاع /queue أو سلوك توجيه الرسائل -summary: أوضاع قائمة انتظار الرد التلقائي، والقيم الافتراضية، والتجاوزات لكل جلسة +summary: أوضاع قائمة انتظار الرد التلقائي، والقيم الافتراضية، والتجاوزات على مستوى كل جلسة title: قائمة انتظار الأوامر x-i18n: - generated_at: "2026-04-30T07:54:51Z" + generated_at: "2026-04-30T18:38:43Z" model: gpt-5.5 provider: openai - source_hash: 2ac0c0ded9558b080714fa4b8be0d552f985911bf19b427020f9654ae4955b2d + source_hash: fbf1bb1ffd4ce06fa138f63e31651b8821226d9c95dd6b93d68326a5fb91fdd0 source_path: concepts/queue.md workflow: 16 --- -نُسلسل عمليات تشغيل الرد التلقائي الواردة (كل القنوات) عبر قائمة انتظار صغيرة داخل العملية لمنع تصادم عمليات تشغيل الوكلاء المتعددة، مع السماح بالتوازي الآمن عبر الجلسات. +نُسلسل تشغيلات الرد التلقائي الواردة (كل القنوات) عبر طابور صغير داخل العملية لمنع تصادم تشغيلات متعددة للوكيل، مع السماح بالتوازي الآمن عبر الجلسات. ## لماذا -- يمكن أن تكون عمليات تشغيل الرد التلقائي مكلفة (استدعاءات LLM) وقد تتصادم عند وصول عدة رسائل واردة في أوقات متقاربة. -- يمنع التسلسل التنافس على الموارد المشتركة (ملفات الجلسة، السجلات، stdin الخاص بـ CLI) ويقلل احتمال بلوغ حدود المعدل لدى الجهات الأعلى. +- قد تكون تشغيلات الرد التلقائي مكلفة (استدعاءات نماذج اللغة الكبيرة) وقد تتصادم عند وصول رسائل واردة متعددة في أوقات متقاربة. +- يتجنب التسلسل التنافس على الموارد المشتركة (ملفات الجلسات، السجلات، إدخال CLI القياسي) ويقلل احتمال بلوغ حدود المعدلات لدى المصدر العلوي. ## كيف يعمل -- تُفرغ قائمة انتظار FIFO واعية بالمسارات كل مسار مع حد تزامن قابل للضبط (الافتراضي 1 للمسارات غير المضبوطة؛ الافتراضي لـ main هو 4، ولـ subagent هو 8). -- يضع `runEmbeddedPiAgent` العناصر في قائمة الانتظار حسب **مفتاح الجلسة** (المسار `session:`) لضمان وجود عملية تشغيل نشطة واحدة فقط لكل جلسة. -- ثم تُضاف كل عملية تشغيل جلسة إلى **مسار عام** (`main` افتراضياً) بحيث يكون إجمالي التوازي محدوداً بواسطة `agents.defaults.maxConcurrent`. -- عند تفعيل التسجيل المطول، تصدر عمليات التشغيل الموضوعة في قائمة الانتظار إشعاراً قصيراً إذا انتظرت أكثر من حوالي 2 ثانية قبل البدء. -- لا تزال مؤشرات الكتابة تُطلق فوراً عند الإضافة إلى قائمة الانتظار (عندما تدعمها القناة)، لذا لا تتغير تجربة المستخدم أثناء انتظار الدور. +- يُفرغ طابور أولاً دخولاً أولاً خروجاً مدرك للمسارات كل مسار بحد أقصى قابل للتكوين للتزامن (الافتراضي 1 للمسارات غير المكوّنة؛ ويكون افتراضي `main` هو 4 و`subagent` هو 8). +- يضع `runEmbeddedPiAgent` العناصر في الطابور حسب **مفتاح الجلسة** (المسار `session:`) لضمان وجود تشغيل نشط واحد فقط لكل جلسة. +- يُوضع كل تشغيل جلسة بعد ذلك في **مسار عام** (`main` افتراضياً) بحيث يكون التوازي الإجمالي محدوداً بواسطة `agents.defaults.maxConcurrent`. +- عند تمكين التسجيل المفصل، تصدر التشغيلات الموضوعة في الطابور إشعاراً قصيراً إذا انتظرت أكثر من نحو ثانيتين قبل البدء. +- تظل مؤشرات الكتابة تعمل فوراً عند الإضافة إلى الطابور (عندما تدعمها القناة)، لذلك لا تتغير تجربة المستخدم أثناء انتظار الدور. -## الافتراضيات +## الإعدادات الافتراضية -عند عدم الضبط، تستخدم كل أسطح القنوات الواردة: +عند عدم التعيين، تستخدم كل أسطح القنوات الواردة ما يلي: - `mode: "steer"` - `debounceMs: 500` - `cap: 20` - `drop: "summarize"` -`steer` هو الافتراضي لأنه يبقي دورة النموذج النشطة مستجيبة دون -بدء عملية تشغيل جلسة ثانية. وهو يفرغ كل رسائل التوجيه التي وصلت -قبل حد النموذج التالي. إذا لم تتمكن عملية التشغيل الحالية من قبول التوجيه، -يتراجع OpenClaw إلى إدخال متابعة في قائمة الانتظار. +`steer` هو الوضع الافتراضي لأنه يحافظ على استجابة دور النموذج النشط دون +بدء تشغيل جلسة ثانية. وهو يفرغ كل رسائل التوجيه التي وصلت +قبل حدّ النموذج التالي. إذا تعذر على التشغيل الحالي قبول التوجيه، +يرجع OpenClaw إلى إدخال طابور متابعة. -## أوضاع قائمة الانتظار +## أوضاع الطابور -يمكن للرسائل الواردة توجيه عملية التشغيل الحالية، أو انتظار دورة متابعة، أو فعل الأمرين معاً: +يمكن للرسائل الواردة توجيه التشغيل الحالي، أو انتظار دور متابعة، أو تنفيذ الأمرين معاً: -- `steer`: يضع رسائل التوجيه في وقت التشغيل النشط. يسلّم Pi كل رسائل التوجيه المعلقة **بعد أن تنتهي دورة المساعد الحالية من تنفيذ استدعاءات أدواتها**، وقبل استدعاء LLM التالي؛ ويتلقى خادم تطبيق Codex دفعة واحدة من `turn/steer`. إذا لم تكن عملية التشغيل تبث بنشاط أو لم يكن التوجيه متاحاً، يتراجع OpenClaw إلى إدخال متابعة في قائمة الانتظار. -- `queue` (قديم): توجيه قديم واحد تلو الآخر. يسلّم Pi رسالة توجيه واحدة موضوعة في قائمة الانتظار عند كل حد نموذج؛ ويتلقى خادم تطبيق Codex طلبات `turn/steer` منفصلة. فضّل `steer` ما لم تكن بحاجة إلى السلوك المتسلسل السابق. -- `followup`: يضع كل رسالة في قائمة الانتظار لدورة وكيل لاحقة بعد انتهاء عملية التشغيل الحالية. -- `collect`: يدمج الرسائل الموضوعة في قائمة الانتظار في دورة متابعة **واحدة** بعد نافذة الهدوء. إذا كانت الرسائل تستهدف قنوات/سلاسل مختلفة، تُفرغ منفردة للحفاظ على التوجيه. -- `steer-backlog` (ويُعرف أيضاً باسم `steer+backlog`): يوجّه الآن **و** يحتفظ بالرسالة نفسها لدورة متابعة. -- `interrupt` (قديم): يجهض عملية التشغيل النشطة لتلك الجلسة، ثم يشغّل أحدث رسالة. +- `steer`: ضع رسائل التوجيه في طابور وقت التشغيل النشط. يسلّم Pi كل رسائل التوجيه المعلقة **بعد أن ينتهي دور المساعد الحالي من تنفيذ استدعاءات أدواته**، وقبل استدعاء نموذج اللغة الكبيرة التالي؛ ويتلقى Codex app-server دفعة واحدة من `turn/steer`. إذا لم يكن التشغيل يبث بنشاط أو لم يكن التوجيه متاحاً، يرجع OpenClaw إلى إدخال طابور متابعة. +- `queue` (قديم): التوجيه القديم واحداً تلو الآخر. يسلّم Pi رسالة توجيه واحدة موضوعة في الطابور عند كل حدّ نموذج؛ ويتلقى Codex app-server طلبات `turn/steer` منفصلة. فضّل `steer` إلا إذا كنت تحتاج إلى السلوك السابق المتسلسل. +- `followup`: ضع كل رسالة في الطابور لدور وكيل لاحق بعد انتهاء التشغيل الحالي. +- `collect`: ادمج الرسائل الموضوعة في الطابور في دور متابعة **واحد** بعد نافذة الهدوء. إذا كانت الرسائل تستهدف قنوات/سلاسل مختلفة، تُفرغ بشكل منفرد للحفاظ على التوجيه. +- `steer-backlog` (ويُعرف أيضاً باسم `steer+backlog`): وجّه الآن **و**احتفظ بالرسالة نفسها لدور متابعة. +- `interrupt` (قديم): أوقف التشغيل النشط لتلك الجلسة، ثم شغّل أحدث رسالة. -يعني Steer-backlog أنك قد تحصل على استجابة متابعة بعد عملية التشغيل الموجّهة، لذا -قد تبدو أسطح البث وكأنها تكرر الاستجابات. فضّل `collect`/`steer` إذا كنت تريد +يعني Steer-backlog أنك قد تحصل على استجابة متابعة بعد التشغيل الموجّه، لذلك +قد تبدو أسطح البث كأنها مكررة. فضّل `collect`/`steer` إذا كنت تريد استجابة واحدة لكل رسالة واردة. -للاطلاع على توقيت وقت التشغيل وسلوك التبعيات المحدد، راجع -[قائمة انتظار التوجيه](/ar/concepts/queue-steering). +للتوقيت الخاص بوقت التشغيل وسلوك التبعيات، راجع +[طابور التوجيه](/ar/concepts/queue-steering). اضبطه عالمياً أو لكل قناة عبر `messages.queue`: @@ -76,55 +76,55 @@ x-i18n: } ``` -## خيارات قائمة الانتظار +## خيارات الطابور -تنطبق الخيارات على `followup` و`collect` و`steer-backlog` (وعلى `steer` أو `queue` القديم عندما يتراجع التوجيه إلى متابعة): +تنطبق الخيارات على `followup` و`collect` و`steer-backlog` (وعلى `steer` أو `queue` القديم عندما يرجع التوجيه إلى المتابعة): -- `debounceMs`: نافذة الهدوء قبل تفريغ المتابعات الموضوعة في قائمة الانتظار. الأرقام المجردة هي بالمللي ثانية؛ وتقبل خيارات `/queue` الوحدات `ms` و`s` و`m` و`h` و`d`. -- `cap`: الحد الأقصى للرسائل الموضوعة في قائمة الانتظار لكل جلسة. تُتجاهل القيم الأقل من `1`. -- `drop: "summarize"`: الافتراضي. يسقط أقدم الإدخالات الموضوعة في قائمة الانتظار حسب الحاجة، ويحافظ على ملخصات مضغوطة، ويحقنها كمطالبة متابعة اصطناعية. -- `drop: "old"`: يسقط أقدم الإدخالات الموضوعة في قائمة الانتظار حسب الحاجة، دون الحفاظ على الملخصات. -- `drop: "new"`: يرفض أحدث رسالة عندما تكون قائمة الانتظار ممتلئة بالفعل. +- `debounceMs`: نافذة هدوء قبل تفريغ المتابعات الموضوعة في الطابور. الأرقام المجردة بالمللي ثانية؛ وتقبل خيارات `/queue` الوحدات `ms` و`s` و`m` و`h` و`d`. +- `cap`: الحد الأقصى للرسائل الموضوعة في الطابور لكل جلسة. تُتجاهل القيم الأقل من `1`. +- `drop: "summarize"`: الافتراضي. أسقط أقدم الإدخالات الموضوعة في الطابور حسب الحاجة، واحتفظ بملخصات مضغوطة، واحقنها كموجّه متابعة اصطناعي. +- `drop: "old"`: أسقط أقدم الإدخالات الموضوعة في الطابور حسب الحاجة، دون الاحتفاظ بالملخصات. +- `drop: "new"`: ارفض أحدث رسالة عندما يكون الطابور ممتلئاً بالفعل. -الافتراضيات: `debounceMs: 500`، و`cap: 20`، و`drop: summarize`. +الإعدادات الافتراضية: `debounceMs: 500`، و`cap: 20`، و`drop: summarize`. ## الأسبقية -لاختيار الوضع، يحل OpenClaw وفقاً لما يلي: +لاختيار الوضع، يحل OpenClaw بالترتيب التالي: -1. تجاوز `/queue` مضمّن أو مخزن لكل جلسة. +1. تجاوز `/queue` المضمّن أو المخزن لكل جلسة. 2. `messages.queue.byChannel.`. 3. `messages.queue.mode`. 4. `steer` الافتراضي. -بالنسبة إلى الخيارات، تتغلب خيارات `/queue` المضمنة أو المخزنة على الضبط. ثم -تُطبق مهلة debounce الخاصة بالقناة (`messages.queue.debounceMsByChannel`)، وافتراضيات -مهلة debounce الخاصة بالـ plugin، وخيارات `messages.queue` العامة، والافتراضيات -المدمجة. يُعد `cap` و`drop` خيارين عامين/خاصين بالجلسة، وليسا مفاتيح ضبط -لكل قناة. +بالنسبة إلى الخيارات، تتغلب خيارات `/queue` المضمّنة أو المخزنة على التكوين. بعد ذلك +تُطبق مهلة الانتظار الخاصة بالقناة (`messages.queue.debounceMsByChannel`)، +وافتراضيات مهلة الانتظار في Plugin، وخيارات `messages.queue` العالمية، والافتراضيات المضمنة. +`cap` و`drop` خياران عالميان/خاصان بالجلسة، وليسا مفاتيح تكوين لكل قناة. ## التجاوزات لكل جلسة - أرسل `/queue ` كأمر مستقل لتخزين الوضع للجلسة الحالية. -- يمكن جمع الخيارات: `/queue collect debounce:0.5s cap:25 drop:summarize` +- يمكن دمج الخيارات: `/queue collect debounce:0.5s cap:25 drop:summarize` - يمسح `/queue default` أو `/queue reset` تجاوز الجلسة. ## النطاق والضمانات -- ينطبق على عمليات تشغيل وكلاء الرد التلقائي عبر كل القنوات الواردة التي تستخدم مسار رد Gateway (WhatsApp web وTelegram وSlack وDiscord وSignal وiMessage وwebchat، إلخ). -- المسار الافتراضي (`main`) على مستوى العملية للوارد + Heartbeat الرئيسية؛ اضبط `agents.defaults.maxConcurrent` للسماح بعدة جلسات بالتوازي. -- قد توجد مسارات إضافية (مثل `cron` و`cron-nested` و`nested` و`subagent`) بحيث يمكن للمهام الخلفية العمل بالتوازي دون حظر الردود الواردة. تحتفظ دورات وكيل Cron المعزولة بفتحة `cron` بينما يستخدم تنفيذ الوكيل الداخلي `cron-nested`؛ وكلاهما يستخدم `cron.maxConcurrentRuns`. تحافظ تدفقات `nested` المشتركة غير التابعة لـ Cron على سلوك مسارها الخاص. تُتتبع عمليات التشغيل المنفصلة هذه كـ [مهام خلفية](/ar/automation/tasks). -- تضمن مسارات كل جلسة أن عملية تشغيل وكيل واحدة فقط تلمس جلسة معينة في كل مرة. +- ينطبق على تشغيلات وكلاء الرد التلقائي عبر كل القنوات الواردة التي تستخدم مسار رد Gateway (WhatsApp web، Telegram، Slack، Discord، Signal، iMessage، webchat، إلخ). +- المسار الافتراضي (`main`) على مستوى العملية للوارد + Heartbeats الرئيسية؛ اضبط `agents.defaults.maxConcurrent` للسماح بجلسات متعددة بالتوازي. +- قد توجد مسارات إضافية (مثل `cron` و`cron-nested` و`nested` و`subagent`) بحيث يمكن تشغيل المهام الخلفية بالتوازي دون حظر الردود الواردة. تحتفظ أدوار وكيل Cron المعزولة بخانة `cron` بينما يستخدم تنفيذ الوكيل الداخلي `cron-nested`؛ ويستخدم كلاهما `cron.maxConcurrentRuns`. تحافظ تدفقات `nested` المشتركة غير التابعة لـ Cron على سلوك مسارها الخاص. تُتبع هذه التشغيلات المنفصلة كـ[مهام خلفية](/ar/automation/tasks). +- تضمن المسارات لكل جلسة أن تشغيل وكيل واحداً فقط يلمس جلسة معينة في كل مرة. - لا توجد تبعيات خارجية أو سلاسل عمال خلفية؛ TypeScript خالص + وعود. ## استكشاف الأخطاء وإصلاحها -- إذا بدت الأوامر عالقة، فعّل السجلات المطولة وابحث عن أسطر “queued for …ms” لتأكيد أن قائمة الانتظار تُفرغ. -- إذا كنت تحتاج إلى عمق قائمة الانتظار، فعّل السجلات المطولة وراقب أسطر توقيت قائمة الانتظار. -- عند تفعيل التشخيصات، تسجل الجلسات التي تبقى في `processing` بعد `diagnostics.stuckSessionWarnMs` تحذيراً بشأن جلسة عالقة. تبقى عمليات التشغيل المضمنة النشطة، وعمليات الرد النشطة، ومهام المسارات النشطة تحذيرية فقط افتراضياً؛ ويمكن لسجلات بدء التشغيل القديمة دون عمل جلسة نشط تحرير مسار الجلسة المتأثرة بحيث يُفرغ العمل الموضوع في قائمة الانتظار. +- إذا بدت الأوامر عالقة، فعّل السجلات المفصلة وابحث عن أسطر “queued for …ms” للتأكد من أن الطابور يُفرغ. +- إذا كنت تحتاج إلى عمق الطابور، فعّل السجلات المفصلة وراقب أسطر توقيت الطابور. +- تشغيلات Codex app-server التي تقبل دوراً ثم تتوقف عن إصدار التقدم تُقاطَع بواسطة محوّل Codex بحيث يمكن تحرير مسار الجلسة النشطة بدلاً من انتظار انتهاء مهلة التشغيل الخارجي. +- عند تمكين التشخيصات، تسجل الجلسات التي تبقى في `processing` بعد `diagnostics.stuckSessionWarnMs` تحذير جلسة عالقة. تظل التشغيلات المضمنة النشطة، وعمليات الرد النشطة، ومهام المسارات النشطة تحذيرية فقط افتراضياً؛ ويمكن لمسك دفاتر بدء التشغيل القديم دون عمل جلسة نشط أن يحرر مسار الجلسة المتأثر حتى يُفرغ العمل الموضوع في الطابور. -## ذات صلة +## ذو صلة - [إدارة الجلسات](/ar/concepts/session) -- [قائمة انتظار التوجيه](/ar/concepts/queue-steering) +- [طابور التوجيه](/ar/concepts/queue-steering) - [سياسة إعادة المحاولة](/ar/concepts/retry) diff --git a/docs/ar/help/testing.md b/docs/ar/help/testing.md index fbaabd28e..9b6cca22b 100644 --- a/docs/ar/help/testing.md +++ b/docs/ar/help/testing.md @@ -1,207 +1,207 @@ --- read_when: - - تشغيل الاختبارات محليًا أو في CI - - إضافة اختبارات انحدار لأخطاء النماذج/المزوّدين - - تصحيح أخطاء سلوك Gateway + الوكيل -summary: 'مجموعة أدوات الاختبار: مجموعات اختبارات الوحدات وe2e والاختبارات الحية، ومشغّلات Docker، وما يغطيه كل اختبار' + - تشغيل الاختبارات محليًا أو في بيئة التكامل المستمر + - إضافة اختبارات انحدار لأخطاء النموذج/المزوّد + - تصحيح أخطاء سلوك Gateway والوكيل +summary: 'عدة الاختبار: مجموعات اختبارات الوحدة/الطرف إلى الطرف/المباشرة، ومشغلات Docker، وما يغطيه كل اختبار' title: الاختبار x-i18n: - generated_at: "2026-04-30T08:05:33Z" + generated_at: "2026-04-30T18:38:57Z" model: gpt-5.5 provider: openai - source_hash: c7b506350f11431195cb55c84cb10e99efb5f43b934079528b982627024d1ffc + source_hash: 470a96c6b47c2708950d05adc4a4efba5fe290f0675a131e2888d2d0032d5953 source_path: help/testing.md workflow: 16 --- -يحتوي OpenClaw على ثلاث مجموعات Vitest (وحدة/تكامل، e2e، مباشرة) ومجموعة صغيرة -من مشغلات Docker. هذا المستند دليل "كيف نختبر": +لدى OpenClaw ثلاث مجموعات Vitest (وحدة/تكامل، e2e، مباشرة) ومجموعة صغيرة +من مشغلات Docker. هذا المستند هو دليل "كيف نختبر": -- ما تغطيه كل مجموعة (وما تتعمد _عدم_ تغطيته). -- أي أوامر يجب تشغيلها لسير العمل الشائع (محليًا، قبل الدفع، التصحيح). -- كيف تكتشف الاختبارات المباشرة بيانات الاعتماد وتختار النماذج/المزوّدين. -- كيف تضيف اختبارات تراجع لمشكلات النماذج/المزوّدين الواقعية. +- ما تغطيه كل مجموعة (وما لا تغطيه عمدا). +- الأوامر التي يجب تشغيلها لسير العمل الشائع (محليا، قبل الدفع، التصحيح). +- كيف تكتشف الاختبارات المباشرة بيانات الاعتماد وتختار النماذج/الموفرين. +- كيف تضيف اختبارات رجعية لمشكلات النماذج/الموفرين الواقعية. -**مكدس QA (qa-lab، qa-channel، مسارات النقل المباشر)** موثق بشكل منفصل: +**مكدس ضمان الجودة (qa-lab، qa-channel، مسارات النقل المباشر)** موثق بشكل منفصل: -- [نظرة عامة على QA](/ar/concepts/qa-e2e-automation) — البنية، سطح الأوامر، تأليف السيناريوهات. -- [Matrix QA](/ar/concepts/qa-matrix) — مرجع لـ `pnpm openclaw qa matrix`. -- [قناة QA](/ar/channels/qa-channel) — Plugin النقل الاصطناعي المستخدم بواسطة السيناريوهات المدعومة بالمستودع. +- [نظرة عامة على ضمان الجودة](/ar/concepts/qa-e2e-automation) — البنية، سطح الأوامر، تأليف السيناريوهات. +- [ضمان جودة Matrix](/ar/concepts/qa-matrix) — مرجع لـ `pnpm openclaw qa matrix`. +- [قناة ضمان الجودة](/ar/channels/qa-channel) — Plugin النقل الاصطناعي المستخدم بواسطة السيناريوهات المدعومة بالمستودع. -تغطي هذه الصفحة تشغيل مجموعات الاختبار العادية ومشغلات Docker/Parallels. يسرد قسم مشغلات QA المحددة أدناه ([مشغلات خاصة بـ QA](#qa-specific-runners)) استدعاءات `qa` الملموسة ويشير مجددًا إلى المراجع أعلاه. +تغطي هذه الصفحة تشغيل مجموعات الاختبار العادية ومشغلات Docker/Parallels. يسرد قسم المشغلات الخاصة بضمان الجودة أدناه ([المشغلات الخاصة بضمان الجودة](#qa-specific-runners)) استدعاءات `qa` المحددة ويعيد الإشارة إلى المراجع أعلاه. -## بدء سريع +## البدء السريع في معظم الأيام: - البوابة الكاملة (متوقعة قبل الدفع): `pnpm build && pnpm check && pnpm check:test-types && pnpm test` -- تشغيل أسرع للمجموعة الكاملة محليًا على جهاز واسع الموارد: `pnpm test:max` -- حلقة مراقبة Vitest المباشرة: `pnpm test:watch` -- الاستهداف المباشر للملفات يوجّه الآن مسارات الامتدادات/القنوات أيضًا: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` -- فضّل التشغيلات المستهدفة أولًا عندما تكرر العمل على فشل واحد. -- موقع QA المدعوم بـ Docker: `pnpm qa:lab:up` -- مسار QA المدعوم بآلة Linux افتراضية: `pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline` +- تشغيل أسرع للمجموعة الكاملة محليا على جهاز واسع الموارد: `pnpm test:max` +- حلقة مراقبة Vitest مباشرة: `pnpm test:watch` +- استهداف الملفات المباشر يوجه الآن مسارات الإضافات/القنوات أيضا: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` +- فضّل التشغيلات المستهدفة أولا عندما تكرر العمل على فشل واحد. +- موقع ضمان الجودة المدعوم بـ Docker: `pnpm qa:lab:up` +- مسار ضمان الجودة المدعوم بآلة Linux افتراضية: `pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline` عندما تلمس الاختبارات أو تريد ثقة إضافية: - بوابة التغطية: `pnpm test:coverage` - مجموعة E2E: `pnpm test:e2e` -عند تصحيح مزوّدين/نماذج حقيقية (يتطلب بيانات اعتماد حقيقية): +عند تصحيح الموفرين/النماذج الحقيقية (يتطلب بيانات اعتماد حقيقية): -- المجموعة المباشرة (النماذج + فحوصات Gateway للأدوات/الصور): `pnpm test:live` -- استهداف ملف مباشر واحد بهدوء: `pnpm test:live -- src/agents/models.profiles.live.test.ts` -- مسح نماذج Docker المباشر: `pnpm test:docker:live-models` - - يشغّل كل نموذج محدد دورة نصية إضافة إلى فحص صغير بأسلوب قراءة ملف. - النماذج التي تعلن بياناتها الوصفية عن إدخال `image` تشغّل أيضًا دورة صورة صغيرة. - عطّل الفحوصات الإضافية باستخدام `OPENCLAW_LIVE_MODEL_FILE_PROBE=0` أو - `OPENCLAW_LIVE_MODEL_IMAGE_PROBE=0` عند عزل إخفاقات المزوّد. - - تغطية CI: تستدعي كل من `OpenClaw Scheduled Live And E2E Checks` اليومية و - `OpenClaw Release Checks` اليدوية سير عمل live/E2E القابل لإعادة الاستخدام مع - `include_live_suites: true`، وهو ما يتضمن مهام مصفوفة منفصلة لنماذج Docker المباشرة - مقسمة حسب المزوّد. - - لإعادة تشغيل CI المركزة، شغّل `OpenClaw Live And E2E Checks (Reusable)` +- المجموعة المباشرة (النماذج + اختبارات Gateway للأدوات/الصور): `pnpm test:live` +- استهدف ملفا مباشرا واحدا بهدوء: `pnpm test:live -- src/agents/models.profiles.live.test.ts` +- مسح النماذج المباشر عبر Docker: `pnpm test:docker:live-models` + - يشغل كل نموذج محدد الآن دورة نصية بالإضافة إلى اختبار صغير بأسلوب قراءة الملفات. + النماذج التي تعلن بياناتها الوصفية عن إدخال `image` تشغل أيضا دورة صورة صغيرة. + عطّل الاختبارات الإضافية باستخدام `OPENCLAW_LIVE_MODEL_FILE_PROBE=0` أو + `OPENCLAW_LIVE_MODEL_IMAGE_PROBE=0` عند عزل إخفاقات الموفر. + - تغطية CI: يستدعي كل من `OpenClaw Scheduled Live And E2E Checks` اليومي و + `OpenClaw Release Checks` اليدوي سير العمل المباشر/E2E القابل لإعادة الاستخدام مع + `include_live_suites: true`، والذي يتضمن وظائف مصفوفة نماذج مباشرة منفصلة في Docker + مقسمة حسب الموفر. + - لإعادات تشغيل CI المركزة، شغّل `OpenClaw Live And E2E Checks (Reusable)` مع `include_live_suites: true` و `live_models_only: true`. - - أضف أسرار المزوّد عالية الإشارة الجديدة إلى `scripts/ci-hydrate-live-auth.sh` - إضافة إلى `.github/workflows/openclaw-live-and-e2e-checks-reusable.yml` ومستدعيه - المجدولين/الخاصين بالإصدار. -- فحص دخان محادثة Codex الأصلية المرتبطة: `pnpm test:docker:live-codex-bind` - - يشغّل مسار Docker مباشرًا ضد مسار خادم تطبيق Codex، ويربط رسالة Slack DM اصطناعية - عبر `/codex bind`، ويجرب `/codex fast` و - `/codex permissions`، ثم يتحقق من توجيه رد عادي ومرفق صورة - عبر ربط Plugin الأصلي بدلًا من ACP. -- فحص دخان حاضنة خادم تطبيق Codex: `pnpm test:docker:live-codex-harness` - - يشغّل دورات وكيل Gateway عبر حاضنة خادم تطبيق Codex المملوكة لـ Plugin، - ويتحقق من `/codex status` و `/codex models`، وبشكل افتراضي يجرب فحوصات الصورة - وCron MCP والوكيل الفرعي وGuardian. عطّل فحص الوكيل الفرعي باستخدام + - أضف أسرار الموفر عالية الإشارة الجديدة إلى `scripts/ci-hydrate-live-auth.sh` + بالإضافة إلى `.github/workflows/openclaw-live-and-e2e-checks-reusable.yml` ومستدعيه + المجدولين/إصداراته. +- اختبار دخان الدردشة المرتبطة الأصلي لـ Codex: `pnpm test:docker:live-codex-bind` + - يشغل مسار Docker مباشرا عبر مسار خادم تطبيق Codex، ويربط رسالة Slack مباشرة اصطناعية + باستخدام `/codex bind`، ويمارس `/codex fast` و + `/codex permissions`، ثم يتحقق من أن ردا عاديا ومرفق صورة + يمران عبر ربط Plugin الأصلي بدلا من ACP. +- اختبار دخان حزمة خادم تطبيق Codex: `pnpm test:docker:live-codex-harness` + - يشغل دورات وكيل Gateway عبر حزمة خادم تطبيق Codex المملوكة للـ Plugin، + ويتحقق من `/codex status` و `/codex models`، وبشكل افتراضي يمارس اختبارات الصورة، + و cron MCP، والوكيل الفرعي، و Guardian. عطّل اختبار الوكيل الفرعي باستخدام `OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0` عند عزل إخفاقات أخرى في - خادم تطبيق Codex. لفحص مركز للوكيل الفرعي، عطّل الفحوصات الأخرى: + خادم تطبيق Codex. لفحص وكيل فرعي مركز، عطّل الاختبارات الأخرى: `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=1 pnpm test:docker:live-codex-harness`. - يخرج هذا بعد فحص الوكيل الفرعي ما لم يتم تعيين + يخرج هذا بعد اختبار الوكيل الفرعي ما لم يتم تعيين `OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0`. -- فحص دخان أمر إنقاذ Crestodian: `pnpm test:live:crestodian-rescue-channel` - - فحص اختياري احتياطي لسطح أمر الإنقاذ في قناة الرسائل. - يجرّب `/crestodian status`، ويضع تغيير نموذج دائمًا في الصف، - ويرد بـ `/crestodian yes`، ويتحقق من مسار كتابة التدقيق/الإعدادات. -- فحص دخان Docker لمخطط Crestodian: `pnpm test:docker:crestodian-planner` - - يشغّل Crestodian في حاوية بلا إعدادات مع Claude CLI وهمي على `PATH` - ويتحقق من أن التراجع الغامض للمخطط يترجم إلى كتابة إعدادات typed مدققة. -- فحص دخان Docker للتشغيل الأول لـ Crestodian: `pnpm test:docker:crestodian-first-run` - - يبدأ من دليل حالة OpenClaw فارغ، ويوجّه `openclaw` المجرد إلى - Crestodian، ويطبق إعداد/نموذج/وكيل/Plugin Discord + كتابات SecretRef، - ويتحقق من الإعدادات، ويتحقق من إدخالات التدقيق. مسار إعداد Ring 0 نفسه - مغطى أيضًا في QA Lab بواسطة +- اختبار دخان أمر إنقاذ Crestodian: `pnpm test:live:crestodian-rescue-channel` + - فحص اختياري زائد التحوط لسطح أمر الإنقاذ في قناة الرسائل. + يمارس `/crestodian status`، ويضع تغيير نموذج مستمرا في الطابور، + ويرد بـ `/crestodian yes`، ويتحقق من مسار كتابة التدقيق/الإعداد. +- اختبار دخان مخطط Crestodian في Docker: `pnpm test:docker:crestodian-planner` + - يشغل Crestodian في حاوية بلا إعدادات مع Claude CLI مزيف على `PATH` + ويتحقق من أن الرجوع الاحتياطي للمخطط الضبابي يترجم إلى كتابة إعدادات نمطية مدققة. +- اختبار دخان التشغيل الأول لـ Crestodian في Docker: `pnpm test:docker:crestodian-first-run` + - يبدأ من دليل حالة OpenClaw فارغ، ويوجه `openclaw` العاري إلى + Crestodian، ويطبق كتابات إعداد/نموذج/وكيل/Plugin Discord + SecretRef، + ويتحقق من الإعدادات، ويتحقق من إدخالات التدقيق. تتم تغطية مسار إعداد Ring 0 نفسه + أيضا في QA Lab بواسطة `pnpm openclaw qa suite --scenario crestodian-ring-zero-setup`. -- فحص دخان تكلفة Moonshot/Kimi: مع تعيين `MOONSHOT_API_KEY`، شغّل +- اختبار دخان تكلفة Moonshot/Kimi: مع تعيين `MOONSHOT_API_KEY`، شغّل `openclaw models list --provider moonshot --json`، ثم شغّل `openclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --json` - مع `moonshot/kimi-k2.6`. تحقق من أن JSON يبلغ عن Moonshot/K2.6 وأن - نص المساعد يخزن `usage.cost` الموحّد. + مع `moonshot/kimi-k2.6`. تحقق من أن JSON يبلغ عن Moonshot/K2.6 وأن نص المساعد + يخزن `usage.cost` المعياري. -عندما تحتاج إلى حالة فاشلة واحدة فقط، فضّل تضييق الاختبارات المباشرة عبر متغيرات بيئة قائمة السماح الموضحة أدناه. +عندما تحتاج إلى حالة فاشلة واحدة فقط، فضّل تضييق الاختبارات المباشرة عبر متغيرات البيئة لقائمة السماح الموضحة أدناه. -## مشغلات خاصة بـ QA +## المشغلات الخاصة بضمان الجودة -تقع هذه الأوامر بجانب مجموعات الاختبار الرئيسية عندما تحتاج إلى واقعية QA-lab: +تقف هذه الأوامر بجانب مجموعات الاختبار الرئيسية عندما تحتاج إلى واقعية QA-lab: -يشغّل CI ‏QA Lab في سير عمل مخصصة. يعمل `Parity gate` على طلبات PR المطابقة -ومن التشغيل اليدوي مع مزوّدين وهميين. يعمل `QA-Lab - All Lanes` كل ليلة على +يشغل CI‏ QA Lab في سير عمل مخصصة. تعمل `Parity gate` على طلبات السحب المطابقة +ومن التشغيل اليدوي مع موفرين وهميين. تعمل `QA-Lab - All Lanes` ليلا على `main` ومن التشغيل اليدوي مع بوابة التكافؤ الوهمية، ومسار Matrix المباشر، -ومسار Telegram المباشر المُدار بواسطة Convex، ومسار Discord المباشر المُدار بواسطة Convex -كمهام متوازية. تمرر فحوصات QA المجدولة وفحوصات الإصدار `--profile fast` لـ Matrix -صراحةً، بينما تبقى القيم الافتراضية لمدخل CLI الخاص بـ Matrix وسير العمل اليدوي -`all`؛ ويمكن للتشغيل اليدوي تقسيم `all` إلى مهام `transport` و`media` و`e2ee-smoke` -و`e2ee-deep` و`e2ee-cli`. يشغّل `OpenClaw Release Checks` التكافؤ إضافة إلى -مسارات Matrix وTelegram السريعة قبل موافقة الإصدار، باستخدام +ومسار Telegram المباشر المدار بواسطة Convex، ومسار Discord المباشر المدار بواسطة Convex +كوظائف متوازية. تمرر فحوصات ضمان الجودة المجدولة والإصدار `--profile fast` لـ Matrix +صراحة، بينما تبقى قيم Matrix CLI وإدخال سير العمل اليدوي الافتراضية +`all`؛ يمكن للتشغيل اليدوي تقسيم `all` إلى وظائف `transport`، و `media`، و `e2ee-smoke`، +و `e2ee-deep`، و `e2ee-cli`. يشغل `OpenClaw Release Checks` التكافؤ بالإضافة إلى +مساري Matrix السريع و Telegram قبل موافقة الإصدار، باستخدام `mock-openai/gpt-5.5` لفحوصات نقل الإصدار بحيث تبقى حتمية -وتتجنب بدء تشغيل Plugin المزوّد المعتاد. تعطل Gateways النقل المباشر هذه -بحث الذاكرة؛ ويبقى سلوك الذاكرة مغطى بواسطة مجموعات تكافؤ QA. +وتتجنب بدء Plugin الموفر العادي. تعطل بوابات النقل المباشر هذه +بحث الذاكرة؛ يبقى سلوك الذاكرة مغطى بمجموعات تكافؤ ضمان الجودة. -تستخدم أجزاء وسائط الإصدار المباشرة الكاملة -`ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`، والتي تحتوي مسبقًا على -`ffmpeg` و`ffprobe`. تستخدم أجزاء نماذج/خلفيات Docker المباشرة صورة -`ghcr.io/openclaw/openclaw-live-test:` المشتركة المبنية مرة واحدة لكل -commit محدد، ثم تسحبها باستخدام `OPENCLAW_SKIP_DOCKER_BUILD=1` بدلًا من إعادة البناء -داخل كل جزء. +تستخدم أقسام الوسائط المباشرة الكاملة للإصدار +`ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`، والتي تحتوي بالفعل على +`ffmpeg` و `ffprobe`. تستخدم أقسام النماذج/الخلفيات المباشرة في Docker صورة +`ghcr.io/openclaw/openclaw-live-test:` المشتركة المبنية مرة واحدة لكل تنفيذ +محدد، ثم تسحبها باستخدام `OPENCLAW_SKIP_DOCKER_BUILD=1` بدلا من إعادة البناء +داخل كل قسم. - `pnpm openclaw qa suite` - - يشغّل سيناريوهات QA المدعومة بالمستودع مباشرة على المضيف. - - يشغّل عدة سيناريوهات محددة بالتوازي افتراضيًا مع عمال Gateway معزولين. - القيمة الافتراضية لـ `qa-channel` هي التزامن 4 (مقيدة بعدد السيناريوهات - المحددة). استخدم `--concurrency ` لضبط عدد العمال، + - يشغل سيناريوهات ضمان الجودة المدعومة بالمستودع مباشرة على المضيف. + - يشغل عدة سيناريوهات محددة بالتوازي افتراضيا مع عمال Gateway معزولين. + `qa-channel` يستخدم التزامن 4 افتراضيا (مقيدا بعدد السيناريوهات المحددة). + استخدم `--concurrency ` لضبط عدد العمال، أو `--concurrency 1` للمسار التسلسلي الأقدم. - يخرج برمز غير صفري عند فشل أي سيناريو. استخدم `--allow-failures` عندما تريد القطع الأثرية دون رمز خروج فاشل. - - يدعم أوضاع المزوّد `live-frontier` و`mock-openai` و`aimock`. - يبدأ `aimock` خادم مزوّد محليًا مدعومًا بـ AIMock لتغطية تجريبية - للثوابت وبروتوكول mock دون استبدال مسار `mock-openai` الواعي بالسيناريوهات. + - يدعم أوضاع الموفر `live-frontier`، و `mock-openai`، و `aimock`. + يشغّل `aimock` خادم موفر محليا مدعوما بـ AIMock لتغطية تجريبية + للتجهيزات ومحاكاة البروتوكول دون استبدال مسار + `mock-openai` المدرك للسيناريوهات. - `pnpm test:gateway:cpu-scenarios` - - يشغّل قياس بدء Gateway إضافة إلى حزمة صغيرة من سيناريوهات QA Lab الوهمية - (`channel-chat-baseline`، `memory-failure-fallback`، - `gateway-restart-inflight-run`) ويكتب ملخص ملاحظة CPU مجمعًا + - يشغل قياس بدء Gateway بالإضافة إلى حزمة صغيرة من سيناريوهات QA Lab الوهمية + (`channel-chat-baseline`، و `memory-failure-fallback`, + `gateway-restart-inflight-run`) ويكتب ملخص ملاحظة CPU مجمعا تحت `.artifacts/gateway-cpu-scenarios/`. - - يعلّم فقط ملاحظات CPU الساخنة المستمرة افتراضيًا (`--cpu-core-warn` - إضافة إلى `--hot-wall-warn-ms`)، لذا تُسجل اندفاعات بدء التشغيل القصيرة كمقاييس - دون أن تبدو مثل تراجع انشغال Gateway لدقائق طويلة. - - يستخدم قطع `dist` المبنية؛ شغّل البناء أولًا عندما لا تحتوي نسخة checkout - على خرج تشغيل حديث مسبقًا. + - يعلّم فقط ملاحظات CPU الساخنة المستمرة افتراضيا (`--cpu-core-warn` + بالإضافة إلى `--hot-wall-warn-ms`)، لذلك تسجل اندفاعات البدء القصيرة كمقاييس + دون أن تبدو مثل تراجع تثبيت Gateway الذي يستمر دقائق. + - يستخدم قطع `dist` المبنية؛ شغّل بناء أولا عندما لا تكون نسخة العمل + تحتوي بالفعل على خرج تشغيل حديث. - `pnpm openclaw qa suite --runner multipass` - - يشغّل مجموعة QA نفسها داخل آلة Linux افتراضية مؤقتة من Multipass. - - يحتفظ بسلوك اختيار السيناريوهات نفسه كما في `qa suite` على المضيف. - - يعيد استخدام أعلام اختيار المزوّد/النموذج نفسها كما في `qa suite`. - - تمرر التشغيلات المباشرة مدخلات مصادقة QA المدعومة والعملية للضيف: - مفاتيح المزوّد القائمة على البيئة، ومسار إعداد مزوّد QA المباشر، و`CODEX_HOME` + - يشغل مجموعة ضمان الجودة نفسها داخل آلة Linux افتراضية مؤقتة من Multipass. + - يحتفظ بسلوك اختيار السيناريو نفسه مثل `qa suite` على المضيف. + - يعيد استخدام أعلام اختيار الموفر/النموذج نفسها مثل `qa suite`. + - تمرر التشغيلات المباشرة مدخلات مصادقة ضمان الجودة المدعومة العملية للضيف: + مفاتيح الموفر القائمة على البيئة، ومسار إعداد موفر ضمان الجودة المباشر، و `CODEX_HOME` عند وجوده. - - يجب أن تبقى أدلة الخرج تحت جذر المستودع حتى يتمكن الضيف من الكتابة مرة أخرى عبر + - يجب أن تبقى أدلة الإخراج تحت جذر المستودع حتى يتمكن الضيف من الكتابة مرة أخرى عبر مساحة العمل المركبة. - - يكتب تقرير QA والملخص العاديين إضافة إلى سجلات Multipass تحت + - يكتب تقرير وضمان الجودة العادي + الملخص بالإضافة إلى سجلات Multipass تحت `.artifacts/qa-e2e/...`. - `pnpm qa:lab:up` - - يبدأ موقع QA المدعوم بـ Docker لعمل QA بأسلوب المشغّل. + - يبدأ موقع ضمان الجودة المدعوم بـ Docker لعمل ضمان الجودة بأسلوب المشغل. - `pnpm test:docker:npm-onboard-channel-agent` - - يبني tarball لـ npm من نسخة checkout الحالية، ويثبته عالميًا في - Docker، ويشغّل إلحاق مفتاح OpenAI API غير تفاعلي، ويعد Telegram - افتراضيًا، ويتحقق من أن تمكين Plugin يثبت تبعيات التشغيل عند الطلب، - ويشغّل doctor، ويشغّل دورة وكيل محلية واحدة ضد نقطة نهاية OpenAI - وهمية. + - يبني أرشيف npm من نسخة العمل الحالية، ويثبته عالميا في + Docker، ويشغل إعداد مفتاح OpenAI API غير التفاعلي، ويعد Telegram + افتراضيا، ويتحقق من أن تمكين Plugin يثبت تبعيات وقت التشغيل عند + الطلب، ويشغل doctor، ويشغل دورة وكيل محلية واحدة ضد نقطة نهاية OpenAI وهمية. - استخدم `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` لتشغيل مسار التثبيت المعبأ نفسه مع Discord. - `pnpm test:docker:session-runtime-context` - - يشغّل فحص دخان Docker حتميًا للتطبيق المبني لنصوص سياق التشغيل المضمنة. - يتحقق من أن سياق تشغيل OpenClaw المخفي يُحفظ كرسالة مخصصة غير معروضة - بدلًا من التسرب إلى دورة المستخدم المرئية، ثم يزرع جلسة JSONL مكسورة متأثرة + - يشغل اختبار دخان حتميا لتطبيق مبني في Docker لنصوص سياق وقت التشغيل المضمنة. + يتحقق من أن سياق وقت تشغيل OpenClaw المخفي يستمر كرسالة مخصصة غير معروضة + بدلا من التسرب إلى دورة المستخدم المرئية، ثم يزرع جلسة JSONL مكسورة متأثرة ويتحقق من أن `openclaw doctor --fix` يعيد كتابتها إلى الفرع النشط مع نسخة احتياطية. - `pnpm test:docker:npm-telegram-live` - - يثبت حزمة مرشحة لـ OpenClaw في Docker، ويشغّل إلحاق الحزمة المثبتة، - ويعد Telegram عبر CLI المثبت، ثم يعيد استخدام مسار QA المباشر لـ Telegram - مع تلك الحزمة المثبتة بوصفها Gateway للنظام قيد الاختبار. + - يثبت مرشح حزمة OpenClaw في Docker، ويشغل إعداد الحزمة المثبتة، + ويعد Telegram عبر CLI المثبت، ثم يعيد استخدام مسار ضمان الجودة المباشر لـ Telegram + مع تلك الحزمة المثبتة كـ Gateway للنظام قيد الاختبار. - القيمة الافتراضية هي `OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta`؛ عيّن `OPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgz` أو - `OPENCLAW_CURRENT_PACKAGE_TGZ` لاختبار tarball محلي محلول بدلًا من + `OPENCLAW_CURRENT_PACKAGE_TGZ` لاختبار أرشيف محلي محلول بدلا من التثبيت من السجل. - - يستخدم بيانات اعتماد بيئة Telegram نفسها أو مصدر بيانات اعتماد Convex نفسه مثل + - يستخدم بيانات اعتماد بيئة Telegram نفسها أو مصدر بيانات اعتماد Convex مثل `pnpm openclaw qa telegram`. لأتمتة CI/الإصدار، عيّن - `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex` إضافة إلى + `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex` بالإضافة إلى `OPENCLAW_QA_CONVEX_SITE_URL` وسر الدور. إذا كان `OPENCLAW_QA_CONVEX_SITE_URL` وسر دور Convex موجودين في CI، - يختار غلاف Docker ‏Convex تلقائيًا. - - يتجاوز `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainer` قيمة - `OPENCLAW_QA_CREDENTIAL_ROLE` المشتركة لهذا المسار فقط. - - تعرض GitHub Actions هذا المسار أيضًا كسير عمل يدوي للمشرفين + يختار مغلف Docker‏ Convex تلقائيا. + - يتجاوز `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainer` المتغير المشترك + `OPENCLAW_QA_CREDENTIAL_ROLE` لهذا المسار فقط. + - تعرض GitHub Actions هذا المسار أيضا كسير عمل يدوي للمشرف `NPM Telegram Beta E2E`. لا يعمل عند الدمج. يستخدم سير العمل بيئة - `qa-live-shared` وإيجارات بيانات اعتماد Convex CI. -- تعرض GitHub Actions أيضًا `Package Acceptance` لإثبات المنتج كتجربة جانبية - ضد حزمة مرشحة واحدة. يقبل مرجعًا موثوقًا، أو مواصفة npm منشورة، - أو عنوان HTTPS لـ tarball مع SHA-256، أو قطعة tarball من تشغيل آخر، ويرفع - `openclaw-current.tgz` الموحّد باسم `package-under-test`، ثم يشغّل مجدول - Docker E2E الموجود بملفات تعريف مسارات smoke أو package أو product أو full أو custom. - عيّن `telegram_mode=mock-openai` أو `live-frontier` لتشغيل سير عمل - Telegram QA ضد قطعة `package-under-test` نفسها. - - أحدث إثبات منتج beta: + `qa-live-shared` وإيجارات بيانات اعتماد CI من Convex. +- تعرض GitHub Actions أيضا `Package Acceptance` لإثبات جانبي للمنتج + ضد حزمة مرشحة واحدة. يقبل مرجعا موثوقا، أو مواصفة npm منشورة، + أو عنوان URL لأرشيف HTTPS بالإضافة إلى SHA-256، أو قطعة أثرية لأرشيف من تشغيل آخر، ويرفع + `openclaw-current.tgz` المعياري كـ `package-under-test`، ثم يشغل + مجدول Docker E2E الحالي مع ملفات تعريف مسارات smoke، أو package، أو product، أو full، أو custom. + عيّن `telegram_mode=mock-openai` أو `live-frontier` لتشغيل سير عمل ضمان جودة Telegram + ضد قطعة `package-under-test` نفسها. + - إثبات أحدث منتج beta: ```bash gh workflow run package-acceptance.yml --ref main \ @@ -211,7 +211,7 @@ gh workflow run package-acceptance.yml --ref main \ -f telegram_mode=mock-openai ``` -- يتطلب إثبات عنوان tarball URL محدد ملخصًا: +- يتطلب إثبات عنوان URL دقيق للأرشيف بصمة: ```bash gh workflow run package-acceptance.yml --ref main \ @@ -221,7 +221,7 @@ gh workflow run package-acceptance.yml --ref main \ -f suite_profile=package ``` -- ينزّل إثبات الأثر الفني أثراً فنياً من نوع tarball من تشغيل Actions آخر: +- يحمّل إثبات الأثر أرشيف tarball من تشغيل Actions آخر: ```bash gh workflow run package-acceptance.yml --ref main \ @@ -232,86 +232,85 @@ gh workflow run package-acceptance.yml --ref main \ ``` - `pnpm test:docker:bundled-channel-deps` - - يحزم تثبيت بنية OpenClaw الحالية ويثبتها في Docker، ويبدأ Gateway - مع تكوين OpenAI، ثم يفعّل القنوات/Plugins المضمّنة عبر تعديلات - التكوين. - - يتحقق من أن اكتشاف الإعداد يترك تبعيات تشغيل Plugin غير المكوّنة - غائبة، وأن أول تشغيل Gateway أو doctor مكوّن يثبّت تبعيات تشغيل كل - Plugin مضمّن عند الطلب، وأن إعادة التشغيل الثانية لا تعيد تثبيت - التبعيات التي سبق تفعيلها. - - يثبّت أيضاً خط أساس أقدم معروفاً من npm، ويفعّل Telegram قبل تشغيل + - يحزم تثبيت بناء OpenClaw الحالي ويثبّته في Docker، ويبدأ Gateway + مع ضبط OpenAI، ثم يفعّل قنوات/Plugins المضمّنة عبر تعديلات الإعداد. + - يتحقق من أن اكتشاف الإعداد يترك تبعيات تشغيل Plugin غير المضبوطة + غير موجودة، وأن أول تشغيل مضبوط لـ Gateway أو doctor يثبّت تبعيات تشغيل + كل Plugin مضمّن عند الطلب، وأن إعادة التشغيل الثانية لا تعيد تثبيت + التبعيات التي فُعّلت بالفعل. + - يثبّت أيضًا خط أساس npm أقدم معروفًا، ويفعّل Telegram قبل تشغيل `openclaw update --tag `، ويتحقق من أن doctor بعد التحديث - في المرشح يصلح تبعيات تشغيل القناة المضمّنة من دون إصلاح postinstall - من جهة حزمة الاختبار. + للمرشح يصلح تبعيات تشغيل القناة المضمّنة دون إصلاح postinstall من جانب + الحاضنة. - `pnpm test:parallels:npm-update` - - يشغّل اختبار دخان تحديث التثبيت المعبأ الأصلي عبر ضيوف Parallels. يثبّت كل - نظام أساسي محدد أولاً حزمة خط الأساس المطلوبة، ثم يشغّل أمر - `openclaw update` المثبّت في الضيف نفسه ويتحقق من الإصدار المثبّت، - وحالة التحديث، وجاهزية Gateway، ودورة وكيل محلي واحدة. + - يشغّل اختبار تحديث التثبيت المعبأ الأصلي عبر ضيوف Parallels. يثبّت كل + نظام أساسي محدد أولًا حزمة خط الأساس المطلوبة، ثم يشغّل أمر + `openclaw update` المثبّت في الضيف نفسه ويتحقق من النسخة المثبّتة، وحالة + التحديث، وجاهزية Gateway، ودورة واحدة لوكيل محلي. - استخدم `--platform macos` أو `--platform windows` أو `--platform linux` أثناء التكرار على ضيف واحد. استخدم `--json` لمسار أثر الملخص وحالة كل مسار. - - يستخدم مسار OpenAI النموذج `openai/gpt-5.5` افتراضياً لإثبات دورة الوكيل - الحية. مرّر `--model ` أو اضبط - `OPENCLAW_PARALLELS_OPENAI_MODEL` عند التحقق عمداً من نموذج OpenAI آخر. - - غلّف التشغيلات المحلية الطويلة بمهلة زمنية على المضيف حتى لا تستهلك - توقفات نقل Parallels بقية نافذة الاختبار: + - يستخدم مسار OpenAI النموذج `openai/gpt-5.5` افتراضيًا لإثبات دورة الوكيل + الحية. مرّر `--model ` أو عيّن + `OPENCLAW_PARALLELS_OPENAI_MODEL` عند التحقق المتعمّد من نموذج OpenAI آخر. + - غلّف التشغيلات المحلية الطويلة بمهلة على المضيف حتى لا تستهلك حالات توقف + نقل Parallels بقية نافذة الاختبار: ```bash timeout --foreground 150m pnpm test:parallels:npm-update -- --json timeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json ``` - - يكتب السكربت سجلات المسارات المتداخلة تحت `/tmp/openclaw-parallels-npm-update.*`. + - يكتب السكربت سجلات مسارات متداخلة تحت `/tmp/openclaw-parallels-npm-update.*`. افحص `windows-update.log` أو `macos-update.log` أو `linux-update.log` - قبل افتراض أن الغلاف الخارجي متوقف. - - قد يستغرق تحديث Windows من 10 إلى 15 دقيقة في إصلاح doctor/تبعيات - التشغيل بعد التحديث على ضيف بارد؛ يظل ذلك سليماً عندما يكون سجل تصحيح - npm المتداخل يتقدم. - - لا تشغّل هذا الغلاف التجميعي بالتوازي مع مسارات دخان Parallels الفردية - على macOS أو Windows أو Linux. فهي تشترك في حالة VM وقد تتصادم في - استعادة اللقطات، أو تقديم الحزم، أو حالة Gateway الضيف. + قبل افتراض أن الغلاف الخارجي معلّق. + - قد يستغرق تحديث Windows من 10 إلى 15 دقيقة في إصلاح تبعيات doctor/التشغيل + بعد التحديث على ضيف بارد؛ وهذا يظل سليمًا عندما يكون سجل تصحيح npm + المتداخل يتقدم. + - لا تشغّل هذا الغلاف التجميعي بالتوازي مع مسارات اختبار Parallels الفردية + على macOS أو Windows أو Linux. فهي تتشارك حالة VM ويمكن أن تتصادم عند + استعادة اللقطة، أو تقديم الحزمة، أو حالة Gateway الضيف. - يشغّل إثبات ما بعد التحديث سطح Plugin المضمّن العادي لأن واجهات القدرات مثل الكلام، وتوليد الصور، وفهم الوسائط تُحمّل عبر واجهات API التشغيل - المضمّنة حتى عندما لا تتحقق دورة الوكيل نفسها إلا من استجابة نصية بسيطة. + المضمّنة حتى عندما تفحص دورة الوكيل نفسها استجابة نصية بسيطة فقط. - `pnpm openclaw qa aimock` - - يبدأ خادم موفّر AIMock المحلي فقط لاختبار دخان البروتوكول المباشر. + - يبدأ خادم مزود AIMock المحلي فقط لاختبار smoke مباشر للبروتوكول. - `pnpm openclaw qa matrix` - - يشغّل مسار ضمان الجودة الحي لـ Matrix مقابل خادم منازل Tuwunel مؤقت مدعوم بـ Docker. من نسخة المصدر فقط — لا تشحن التثبيتات المعبأة `qa-lab`. - - CLI الكامل، وكتالوج الملفات الشخصية/السيناريوهات، ومتغيرات env، وتخطيط الآثار: [ضمان جودة Matrix](/ar/concepts/qa-matrix). + - يشغّل مسار QA الحي لـ Matrix مقابل خادم Tuwunel homeserver مؤقت مدعوم من Docker. من نسخة مصدرية فقط — لا تشحن التثبيتات المعبأة `qa-lab`. + - CLI الكامل، وكتالوج الملفات الشخصية/السيناريوهات، ومتغيرات البيئة، وتخطيط الآثار: [QA لـ Matrix](/ar/concepts/qa-matrix). - `pnpm openclaw qa telegram` - - يشغّل مسار ضمان الجودة الحي لـ Telegram مقابل مجموعة خاصة حقيقية باستخدام رموز بوت المشغّل وSUT من env. - - يتطلب `OPENCLAW_QA_TELEGRAM_GROUP_ID`، و`OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`، و`OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`. يجب أن يكون معرّف المجموعة هو معرّف محادثة Telegram الرقمي. - - يدعم `--credential-source convex` للاعتمادات المشتركة المجمّعة. استخدم وضع env افتراضياً، أو اضبط `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` للاشتراك في الإيجارات المجمّعة. - - يخرج برمز غير صفري عند فشل أي سيناريو. استخدم `--allow-failures` عندما - تريد آثاراً من دون رمز خروج فاشل. - - يتطلب بوتين مميزين في المجموعة الخاصة نفسها، مع كشف بوت SUT عن اسم مستخدم Telegram. - - لملاحظة مستقرة بين البوتات، فعّل Bot-to-Bot Communication Mode في `@BotFather` لكلا البوتين وتأكد من أن بوت المشغّل يستطيع ملاحظة حركة مرور بوتات المجموعة. - - يكتب تقرير ضمان جودة Telegram، وملخصاً، وأثر الرسائل المرصودة تحت `.artifacts/qa-e2e/...`. تتضمن سيناريوهات الرد RTT من طلب إرسال المشغّل إلى رد SUT المرصود. + - يشغّل مسار QA الحي لـ Telegram مقابل مجموعة خاصة حقيقية باستخدام رموز بوت المشغّل وبوت SUT من البيئة. + - يتطلب `OPENCLAW_QA_TELEGRAM_GROUP_ID` و`OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN` و`OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`. يجب أن يكون معرّف المجموعة هو معرّف محادثة Telegram الرقمي. + - يدعم `--credential-source convex` لبيانات الاعتماد المشتركة المجمّعة. استخدم وضع البيئة افتراضيًا، أو عيّن `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` لاستخدام عقود الإيجار المجمّعة. + - يخرج بقيمة غير صفرية عندما يفشل أي سيناريو. استخدم `--allow-failures` عندما + تريد آثارًا دون رمز خروج فاشل. + - يتطلب بوتين مميزين في المجموعة الخاصة نفسها، مع أن يعرّض بوت SUT اسم مستخدم Telegram. + - للحصول على مراقبة مستقرة بين البوتات، فعّل وضع اتصال البوتات في `@BotFather` لكلا البوتين وتأكد من أن بوت المشغّل يستطيع مراقبة حركة بوتات المجموعة. + - يكتب تقرير QA لـ Telegram، وملخصًا، وأثر الرسائل المرصودة تحت `.artifacts/qa-e2e/...`. تتضمن سيناريوهات الرد RTT من طلب إرسال المشغّل إلى رد SUT المرصود. -تشترك مسارات النقل الحي في عقد قياسي واحد حتى لا تنحرف وسائل النقل الجديدة؛ تعيش مصفوفة تغطية كل مسار في [نظرة عامة على ضمان الجودة → تغطية النقل الحي](/ar/concepts/qa-e2e-automation#live-transport-coverage). يُعد `qa-channel` الحزمة الاصطناعية الواسعة وليس جزءاً من تلك المصفوفة. +تشترك مسارات النقل الحية في عقد قياسي واحد حتى لا تنحرف عمليات النقل الجديدة؛ توجد مصفوفة تغطية كل مسار في [نظرة عامة على QA ← تغطية النقل الحي](/ar/concepts/qa-e2e-automation#live-transport-coverage). إن `qa-channel` هو المجموعة الاصطناعية الواسعة وليس جزءًا من تلك المصفوفة. -### اعتمادات Telegram المشتركة عبر Convex (v1) +### بيانات اعتماد Telegram المشتركة عبر Convex (v1) عند تفعيل `--credential-source convex` (أو `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`) لـ -`openclaw qa telegram`، يحصل مختبر ضمان الجودة على إيجار حصري من مجموعة مدعومة بـ Convex، ويرسل Heartbeat -لذلك الإيجار أثناء تشغيل المسار، ويحرر الإيجار عند الإيقاف. +`openclaw qa telegram`، يحصل مختبر QA على عقد إيجار حصري من مجموعة مدعومة من Convex، ويرسل Heartbeat +لذلك العقد أثناء تشغيل المسار، ويحرر العقد عند الإيقاف. هيكل مشروع Convex المرجعي: - `qa/convex-credential-broker/` -متغيرات env المطلوبة: +متغيرات البيئة المطلوبة: -- `OPENCLAW_QA_CONVEX_SITE_URL` (على سبيل المثال `https://your-deployment.convex.site`) +- `OPENCLAW_QA_CONVEX_SITE_URL` (مثلًا `https://your-deployment.convex.site`) - سر واحد للدور المحدد: - `OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` لـ `maintainer` - `OPENCLAW_QA_CONVEX_SECRET_CI` لـ `ci` -- اختيار دور الاعتماد: +- اختيار دور بيانات الاعتماد: - CLI: `--credential-role maintainer|ci` - - افتراضي env: `OPENCLAW_QA_CREDENTIAL_ROLE` (يكون افتراضياً `ci` في CI، و`maintainer` خلاف ذلك) + - الافتراضي من البيئة: `OPENCLAW_QA_CREDENTIAL_ROLE` (يفترض `ci` في CI، و`maintainer` خلاف ذلك) -متغيرات env اختيارية: +متغيرات البيئة الاختيارية: - `OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS` (الافتراضي `1200000`) - `OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS` (الافتراضي `30000`) @@ -319,12 +318,12 @@ gh workflow run package-acceptance.yml --ref main \ - `OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS` (الافتراضي `15000`) - `OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX` (الافتراضي `/qa-credentials/v1`) - `OPENCLAW_QA_CREDENTIAL_OWNER_ID` (معرّف تتبع اختياري) -- يسمح `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` بعناوين Convex ذات local loopback عبر `http://` للتطوير المحلي فقط. +- يسمح `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` بعناوين URL الخاصة بـ Convex عبر `http://` على local loopback للتطوير المحلي فقط. -يجب أن يستخدم `OPENCLAW_QA_CONVEX_SITE_URL` البادئة `https://` في التشغيل العادي. +يجب أن يستخدم `OPENCLAW_QA_CONVEX_SITE_URL` البروتوكول `https://` في التشغيل العادي. -تتطلب أوامر إدارة المشرفين (إضافة/إزالة/سرد المجموعة) -`OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` تحديداً. +تتطلب أوامر المشرف الخاصة بالمشرفين (إضافة/إزالة/عرض المجموعة) +`OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` تحديدًا. مساعدات CLI للمشرفين: @@ -335,9 +334,10 @@ pnpm openclaw qa credentials list --kind telegram pnpm openclaw qa credentials remove --credential-id ``` -استخدم `doctor` قبل التشغيلات الحية للتحقق من عنوان URL لموقع Convex، وأسرار الوسيط، -وبادئة نقطة النهاية، ومهلة HTTP، وإمكانية الوصول إلى admin/list من دون طباعة -قيم الأسرار. استخدم `--json` لإخراج قابل للقراءة آلياً في السكربتات وأدوات CI. +استخدم `doctor` قبل التشغيلات الحية لفحص عنوان URL لموقع Convex، وأسرار الوسيط، +وبادئة نقطة النهاية، ومهلة HTTP، وإمكانية الوصول إلى admin/list دون طباعة +قيم الأسرار. استخدم `--json` لمخرجات قابلة للقراءة آليًا في السكربتات وأدوات +CI. عقد نقطة النهاية الافتراضي (`OPENCLAW_QA_CONVEX_SITE_URL` + `/qa-credentials/v1`): @@ -357,7 +357,7 @@ pnpm openclaw qa credentials remove --credential-id - `POST /admin/remove` (سر المشرف فقط) - الطلب: `{ credentialId, actorId }` - النجاح: `{ status: "ok", changed, credential }` - - حارس الإيجار النشط: `{ status: "error", code: "LEASE_ACTIVE", ... }` + - حارس عقد الإيجار النشط: `{ status: "error", code: "LEASE_ACTIVE", ... }` - `POST /admin/list` (سر المشرف فقط) - الطلب: `{ kind?, status?, includePayload?, limit? }` - النجاح: `{ status: "ok", credentials, count }` @@ -368,93 +368,93 @@ pnpm openclaw qa credentials remove --credential-id - يجب أن يكون `groupId` سلسلة معرّف محادثة Telegram رقمية. - يتحقق `admin/add` من هذا الشكل لـ `kind: "telegram"` ويرفض الحمولات غير الصحيحة. -### إضافة قناة إلى ضمان الجودة +### إضافة قناة إلى QA -تعيش بنية وأسماء مساعدي السيناريوهات لمحولات القنوات الجديدة في [نظرة عامة على ضمان الجودة → إضافة قناة](/ar/concepts/qa-e2e-automation#adding-a-channel). الحد الأدنى: تنفيذ مشغّل النقل على منفذ المضيف المشترك `qa-lab`، والتصريح عن `qaRunners` في بيان Plugin، والتركيب باسم `openclaw qa `، وتأليف السيناريوهات تحت `qa/scenarios/`. +توجد أسماء البنية ومساعد السيناريو لمحوّلات القنوات الجديدة في [نظرة عامة على QA ← إضافة قناة](/ar/concepts/qa-e2e-automation#adding-a-channel). الحد الأدنى: تنفيذ مشغّل النقل على وصلة مضيف `qa-lab` المشتركة، والتصريح عن `qaRunners` في بيان Plugin، والتركيب باسم `openclaw qa `، وتأليف السيناريوهات تحت `qa/scenarios/`. -## حزم الاختبار (ما الذي يعمل وأين) +## مجموعات الاختبار (ما الذي يعمل وأين) -فكّر في الحزم على أنها «واقعية متزايدة» (ومعها تذبذب/تكلفة متزايدان): +فكّر في المجموعات على أنها “واقعية متزايدة” (مع زيادة عدم الثبات/التكلفة): ### الوحدة / التكامل (افتراضي) - الأمر: `pnpm test` -- التكوين: تستخدم التشغيلات غير المستهدفة مجموعة التجزئة `vitest.full-*.config.ts` وقد توسّع تجزئات المشاريع المتعددة إلى تكوينات لكل مشروع للجدولة المتوازية -- الملفات: قوائم جرد الوحدة/النواة تحت `src/**/*.test.ts`، و`packages/**/*.test.ts`، و`test/**/*.test.ts`؛ تعمل اختبارات وحدة UI في تجزئة `unit-ui` المخصصة +- الإعداد: تستخدم التشغيلات غير المستهدفة مجموعة الشرائح `vitest.full-*.config.ts` وقد توسّع الشرائح متعددة المشاريع إلى إعدادات لكل مشروع للجدولة المتوازية +- الملفات: قوائم جرد الوحدة/النواة تحت `src/**/*.test.ts` و`packages/**/*.test.ts` و`test/**/*.test.ts`؛ تعمل اختبارات وحدة UI في شريحة `unit-ui` المخصصة - النطاق: - - اختبارات وحدة صرفة - - اختبارات تكامل داخل العملية (مصادقة Gateway، والتوجيه، والأدوات، والتحليل، والتكوين) + - اختبارات وحدة صافية + - اختبارات تكامل داخل العملية (مصادقة Gateway، والتوجيه، والأدوات، والتحليل، والإعداد) - انحدارات حتمية للأخطاء المعروفة - التوقعات: - يعمل في CI - لا يتطلب مفاتيح حقيقية - - يجب أن يكون سريعاً ومستقراً + - يجب أن يكون سريعًا ومستقرًا - يجب أن تثبت اختبارات المحلّل ومحمّل السطح العام سلوك الرجوع الواسع لـ `api.js` و `runtime-api.js` باستخدام تجهيزات Plugin صغيرة مولّدة، وليس - واجهات API مصدرية لـ Plugin مضمّن حقيقي. تنتمي تحميلات API الحقيقية لـ Plugin إلى - حزم العقد/التكامل المملوكة لـ Plugin. + واجهات API لمصدر Plugin مضمّن حقيقي. تنتمي عمليات تحميل API الخاصة بـ Plugin الحقيقي إلى + مجموعات العقد/التكامل المملوكة للـ Plugin. - + - - تشغّل عملية `pnpm test` غير المستهدفة اثني عشر إعداد تقسيم أصغر (`core-unit-fast` و`core-unit-src` و`core-unit-security` و`core-unit-ui` و`core-unit-support` و`core-support-boundary` و`core-contracts` و`core-bundled` و`core-runtime` و`agentic` و`auto-reply` و`extensions`) بدلًا من عملية مشروع جذري أصلية واحدة ضخمة. يقلل هذا ذروة RSS على الأجهزة المحمّلة، ويتجنب أن تحرم أعمال auto-reply/extension مجموعات الاختبار غير ذات الصلة من الموارد. - - لا يزال `pnpm test --watch` يستخدم مخطط مشروع الجذر الأصلي `vitest.config.ts`، لأن حلقة المراقبة متعددة التقسيمات غير عملية. - - توجّه `pnpm test` و`pnpm test:watch` و`pnpm test:perf:imports` أهداف الملفات/الدلائل الصريحة عبر المسارات محددة النطاق أولًا، لذلك يتجنب `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` دفع كلفة بدء تشغيل مشروع الجذر كاملة. - - يوسّع `pnpm test:changed` مسارات git المتغيرة إلى مسارات رخيصة محددة النطاق افتراضيًا: تعديلات الاختبارات المباشرة، وملفات `*.test.ts` الشقيقة، وتعيينات المصدر الصريحة، والاعتماديات المحلية في مخطط الاستيراد. لا تؤدي تعديلات الإعداد/config/setup/package إلى تشغيل الاختبارات على نطاق واسع إلا إذا استخدمت صراحةً `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`. - - `pnpm check:changed` هو بوابة الفحص المحلي الذكي المعتادة للأعمال الضيقة. يصنّف الفرق إلى core، واختبارات core، وextensions، واختبارات extension، والتطبيقات، والوثائق، وبيانات تعريف الإصدار، وأدوات Docker الحية، والأدوات، ثم يشغّل أوامر فحص النوع وlint والحراسة المطابقة. لا يشغّل اختبارات Vitest؛ استدعِ `pnpm test:changed` أو `pnpm test ` صريحًا لإثبات الاختبار. تشغّل زيادات الإصدار التي تقتصر على بيانات تعريف الإصدار فقط فحوصات موجهة للإصدار/config/اعتماديات الجذر، مع حارس يرفض تغييرات الحزمة خارج حقل الإصدار في المستوى الأعلى. - - تشغّل تعديلات حزمة Docker ACP الحية فحوصات مركزة: صياغة shell لسكربتات مصادقة Docker الحية، وتشغيلًا تجريبيًا جافًا لمجدول Docker الحي. تُضمَّن تغييرات `package.json` فقط عندما يقتصر الفرق على `scripts["test:docker:live-*"]`؛ أما تعديلات الاعتماديات، والتصدير، والإصدار، وأسطح الحزمة الأخرى فما زالت تستخدم الحراسات الأوسع. - - تمر اختبارات الوحدات خفيفة الاستيراد من agents، وcommands، وplugins، ومساعدات auto-reply، و`plugin-sdk`، ومناطق الأدوات النقية المماثلة عبر مسار `unit-fast`، الذي يتجاوز `test/setup-openclaw-runtime.ts`؛ وتبقى الملفات ذات الحالة/الثقيلة وقت التشغيل على المسارات الحالية. - - تُعيّن أيضًا ملفات مصدر مساعدات مختارة من `plugin-sdk` و`commands` تشغيلات وضع التغييرات إلى اختبارات شقيقة صريحة في تلك المسارات الخفيفة، بحيث تتجنب تعديلات المساعدات إعادة تشغيل المجموعة الثقيلة الكاملة لذلك الدليل. - - لدى `auto-reply` حاويات مخصصة لمساعدات core في المستوى الأعلى، واختبارات التكامل `reply.*` في المستوى الأعلى، والشجرة الفرعية `src/auto-reply/reply/**`. يقسم CI أيضًا الشجرة الفرعية للرد إلى تقسيمات agent-runner وdispatch وcommands/state-routing بحيث لا تملك حاوية واحدة ثقيلة الاستيراد ذيل Node كاملًا. - - يتخطى CI العادي لطلبات PR/main عمدًا مسح دفعة extension وتقسيم `agentic-plugins` الخاص بالإصدار فقط. يطلق Full Release Validation سير العمل الفرعي المنفصل `Plugin Prerelease` لهذه المجموعات الثقيلة في plugin/extension على مرشحي الإصدار. + - تُشغّل عمليات `pnpm test` غير المستهدفة اثني عشر إعدادًا أصغر للتقسيم (`core-unit-fast`، `core-unit-src`، `core-unit-security`، `core-unit-ui`، `core-unit-support`، `core-support-boundary`، `core-contracts`، `core-bundled`، `core-runtime`، `agentic`، `auto-reply`، `extensions`) بدلًا من عملية مشروع جذرية أصلية واحدة ضخمة. يقلّل هذا ذروة RSS على الأجهزة المحمّلة، ويتجنّب أن يؤدي عمل الرد التلقائي/الامتدادات إلى حرمان الحِزم غير ذات الصلة من الموارد. + - لا يزال `pnpm test --watch` يستخدم مخطط مشروع `vitest.config.ts` الجذري الأصلي، لأن حلقة مراقبة متعددة التقسيمات ليست عملية. + - توجّه `pnpm test` و`pnpm test:watch` و`pnpm test:perf:imports` أهداف الملفات/الأدلة الصريحة عبر المسارات محددة النطاق أولًا، لذلك يتجنب `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` دفع تكلفة بدء تشغيل مشروع الجذر بالكامل. + - يوسّع `pnpm test:changed` مسارات git المتغيرة إلى مسارات رخيصة محددة النطاق افتراضيًا: تعديلات الاختبارات المباشرة، وملفات `*.test.ts` الشقيقة، وتعيينات المصدر الصريحة، والاعتماديات المحلية في مخطط الاستيراد. لا تؤدي تعديلات الإعداد/التهيئة/الحزم إلى تشغيل واسع للاختبارات إلا إذا استخدمت صراحةً `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`. + - `pnpm check:changed` هو بوابة الفحص المحلي الذكي المعتادة للعمل الضيق. يصنّف الفرق إلى النواة، واختبارات النواة، والامتدادات، واختبارات الامتدادات، والتطبيقات، والوثائق، وبيانات تعريف الإصدار، وأدوات Docker الحية، والأدوات، ثم يشغّل أوامر فحص الأنواع وlint والحراس المطابقة. لا يشغّل اختبارات Vitest؛ استدعِ `pnpm test:changed` أو `pnpm test ` صريحًا لإثبات الاختبارات. تعمل زيادات الإصدارات التي تقتصر على بيانات تعريف الإصدار على فحوصات مستهدفة للإصدار/الإعداد/اعتماديات الجذر، مع حارس يرفض تغييرات الحزم خارج حقل الإصدار ذي المستوى الأعلى. + - تشغّل تعديلات حاضنة Docker ACP الحية فحوصات مركّزة: صياغة shell لنصوص مصادقة Docker الحية وتشغيلًا تجريبيًا جافًا لمجدول Docker الحي. لا تُدرج تغييرات `package.json` إلا عندما يكون الفرق محدودًا بـ `scripts["test:docker:live-*"]`؛ لا تزال تعديلات الاعتماديات والتصدير والإصدار وغيرها من أسطح الحزمة تستخدم الحراس الأوسع. + - تمر اختبارات الوحدات الخفيفة من ناحية الاستيراد من الوكلاء والأوامر والإضافات ومساعدي الرد التلقائي و`plugin-sdk` ومناطق الأدوات النقية المشابهة عبر مسار `unit-fast`، الذي يتخطى `test/setup-openclaw-runtime.ts`؛ وتبقى الملفات ذات الحالة/الثقيلة وقت التشغيل على المسارات الموجودة. + - تُعيّن أيضًا ملفات مصدر مساعدة مختارة من `plugin-sdk` و`commands` عمليات النمط المتغير إلى اختبارات شقيقة صريحة في تلك المسارات الخفيفة، بحيث تتجنب تعديلات المساعدين إعادة تشغيل الحزمة الثقيلة الكاملة لذلك الدليل. + - لدى `auto-reply` حاويات مخصصة لمساعدي النواة ذوي المستوى الأعلى، واختبارات تكامل `reply.*` ذات المستوى الأعلى، والشجرة الفرعية `src/auto-reply/reply/**`. يقسم CI كذلك الشجرة الفرعية للرد إلى تقسيمات agent-runner وdispatch وcommands/state-routing حتى لا تمتلك حاوية ثقيلة الاستيراد واحدة ذيل Node بالكامل. + - يتخطى CI العادي لـ PR/main عمدًا مسح دفعة الامتدادات وتقسيم `agentic-plugins` المخصص للإصدار فقط. يطلق Full Release Validation سير العمل الفرعي المنفصل `Plugin Prerelease` لتلك الحِزم الثقيلة بالإضافات/الامتدادات على مرشحي الإصدار. - - عند تغيير مدخلات اكتشاف أدوات الرسائل أو سياق وقت تشغيل Compaction، حافظ على مستويي التغطية كليهما. - - أضف اختبارات ارتداد مساعدة مركزة لحدود التوجيه والتطبيع النقية. - - حافظ على سلامة مجموعات تكامل المشغّل المضمنة: + - عند تغيير مُدخلات اكتشاف أدوات الرسائل أو سياق وقت تشغيل Compaction، حافظ على مستويي التغطية كليهما. + - أضف اختبارات انحدار مركّزة للمساعدين لحدود التوجيه والتطبيع النقية. + - أبقِ حِزم تكامل المشغّل المضمّن سليمة: `src/agents/pi-embedded-runner/compact.hooks.test.ts`، `src/agents/pi-embedded-runner/run.overflow-compaction.test.ts`، و `src/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts`. - - تتحقق هذه المجموعات من أن المعرّفات محددة النطاق وسلوك Compaction ما زالا يمران عبر مسارات `run.ts` / `compact.ts` الحقيقية؛ ولا تُعد اختبارات المساعدات فقط بديلًا كافيًا عن مسارات التكامل تلك. + - تتحقق هذه الحِزم من أن المعرّفات محددة النطاق وسلوك Compaction ما زالا يتدفقان عبر مسارات `run.ts` / `compact.ts` الحقيقية؛ اختبارات المساعدين فقط ليست بديلًا كافيًا لتلك مسارات التكامل. - - تضبط إعدادات Vitest الأساسية الافتراضي على `threads`. - - تثبّت إعدادات Vitest المشتركة `isolate: false` وتستخدم المشغّل غير المعزول عبر مشاريع الجذر، وإعدادات e2e، والإعدادات الحية. - - يحتفظ مسار واجهة المستخدم الجذر بإعداد `jsdom` والمحسّن الخاصين به، لكنه يعمل أيضًا على المشغّل المشترك غير المعزول. - - يرث كل تقسيم `pnpm test` نفس إعدادات `threads` + `isolate: false` الافتراضية من إعدادات Vitest المشتركة. - - يضيف `scripts/run-vitest.mjs` الخيار `--no-maglev` لعمليات Node الفرعية الخاصة بـ Vitest افتراضيًا لتقليل اضطراب ترجمة V8 أثناء التشغيلات المحلية الكبيرة. عيّن `OPENCLAW_VITEST_ENABLE_MAGLEV=1` للمقارنة مع سلوك V8 القياسي. + - الإعداد الأساسي لـ Vitest يستخدم `threads` افتراضيًا. + - يثبت إعداد Vitest المشترك `isolate: false` ويستخدم المشغّل غير المعزول عبر مشاريع الجذر، وe2e، والإعدادات الحية. + - يحتفظ مسار واجهة المستخدم الجذري بتهيئة `jsdom` والمحسّن الخاصين به، لكنه يعمل أيضًا على المشغّل المشترك غير المعزول. + - يرث كل تقسيم `pnpm test` الافتراضات نفسها `threads` + `isolate: false` من إعداد Vitest المشترك. + - يضيف `scripts/run-vitest.mjs` الخيار `--no-maglev` لعمليات Node الفرعية الخاصة بـ Vitest افتراضيًا لتقليل اضطراب تجميع V8 أثناء التشغيلات المحلية الكبيرة. عيّن `OPENCLAW_VITEST_ENABLE_MAGLEV=1` للمقارنة مع سلوك V8 القياسي. - يعرض `pnpm changed:lanes` المسارات المعمارية التي يفعّلها الفرق. - - خطاف ما قبل الالتزام مخصص للتنسيق فقط. يعيد staging للملفات المنسقة ولا يشغّل lint أو فحص النوع أو الاختبارات. + - خطاف ما قبل الالتزام مخصص للتنسيق فقط. يعيد تجهيز الملفات المنسّقة ولا يشغّل lint أو فحص الأنواع أو الاختبارات. - شغّل `pnpm check:changed` صراحةً قبل التسليم أو الدفع عندما تحتاج إلى بوابة الفحص المحلي الذكي. - - يوجّه `pnpm test:changed` عبر مسارات رخيصة محددة النطاق افتراضيًا. استخدم `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` فقط عندما يقرر agent أن تعديل حزمة اختبار أو إعداد أو حزمة أو عقد يحتاج فعلًا إلى تغطية Vitest أوسع. + - يمر `pnpm test:changed` عبر مسارات رخيصة محددة النطاق افتراضيًا. استخدم `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` فقط عندما يقرر الوكيل أن تعديل حاضنة أو إعداد أو حزمة أو عقد يحتاج فعلًا إلى تغطية Vitest أوسع. - يحافظ `pnpm test:max` و`pnpm test:changed:max` على سلوك التوجيه نفسه، لكن مع حد أعلى للعاملين. - - التوسيع التلقائي للعاملين محليًا محافظ عمدًا ويتراجع عندما يكون متوسط حمل المضيف مرتفعًا بالفعل، لذلك تُحدث تشغيلات Vitest المتزامنة المتعددة ضررًا أقل افتراضيًا. - - تعلّم إعدادات Vitest الأساسية ملفات المشاريع/الإعدادات على أنها `forceRerunTriggers` بحيث تبقى إعادات التشغيل في وضع التغييرات صحيحة عندما تتغير وصلات الاختبار. - - تبقي الإعدادات `OPENCLAW_VITEST_FS_MODULE_CACHE` مفعّلًا على المضيفات المدعومة؛ عيّن `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` إذا أردت موقع تخزين مؤقت صريحًا واحدًا للتحليل المباشر للأداء. + - توسيع العاملين المحلي التلقائي محافظ عمدًا ويتراجع عندما يكون متوسط حمل المضيف مرتفعًا بالفعل، لذلك تُحدث عمليات Vitest المتزامنة المتعددة ضررًا أقل افتراضيًا. + - يوسم إعداد Vitest الأساسي المشاريع/ملفات الإعداد بأنها `forceRerunTriggers` بحيث تبقى إعادة التشغيل في النمط المتغير صحيحة عند تغيّر توصيلات الاختبار. + - يبقي الإعداد `OPENCLAW_VITEST_FS_MODULE_CACHE` مفعّلًا على المضيفين المدعومين؛ عيّن `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` إذا أردت موقع ذاكرة تخزين مؤقت صريحًا واحدًا للتنميط المباشر. - - يفعّل `pnpm test:perf:imports` تقارير مدة الاستيراد في Vitest بالإضافة إلى إخراج تفصيل الاستيراد. - - يحدد `pnpm test:perf:imports:changed` نطاق عرض التحليل نفسه على الملفات المتغيرة منذ `origin/main`. - - تُكتب بيانات توقيت التقسيم إلى `.artifacts/vitest-shard-timings.json`. تستخدم تشغيلات الإعداد الكامل مسار الإعداد كمفتاح؛ وتضيف تقسيمات CI بنمط التضمين اسم التقسيم بحيث يمكن تتبع التقسيمات المفلترة بشكل منفصل. - - عندما لا يزال اختبار ساخن واحد يقضي معظم وقته في استيرادات بدء التشغيل، أبقِ الاعتماديات الثقيلة خلف حد محلي ضيق `*.runtime.ts` وحاكِ ذلك الحد مباشرة بدلًا من الاستيراد العميق لمساعدات وقت التشغيل لمجرد تمريرها عبر `vi.mock(...)`. - - يقارن `pnpm test:perf:changed:bench -- --ref ` بين `test:changed` الموجّه ومسار مشروع الجذر الأصلي لذلك الفرق الملتزم به، ويطبع وقت الحائط بالإضافة إلى RSS الأقصى على macOS. - - يقيس `pnpm test:perf:changed:bench -- --worktree` أداء الشجرة الحالية غير النظيفة عبر توجيه قائمة الملفات المتغيرة من خلال `scripts/test-projects.mjs` وإعدادات Vitest الجذرية. - - يكتب `pnpm test:perf:profile:main` ملف تعريف CPU للخيط الرئيسي لكلفة بدء تشغيل Vitest/Vite والتحويل. - - يكتب `pnpm test:perf:profile:runner` ملفات تعريف CPU+heap للمشغّل لمجموعة الوحدات مع تعطيل توازي الملفات. + - يفعّل `pnpm test:perf:imports` تقارير مدة الاستيراد في Vitest بالإضافة إلى مخرجات تفصيل الاستيراد. + - يقيّد `pnpm test:perf:imports:changed` عرض التنميط نفسه على الملفات المتغيرة منذ `origin/main`. + - تُكتب بيانات توقيت التقسيم إلى `.artifacts/vitest-shard-timings.json`. تستخدم تشغيلات الإعداد الكامل مسار الإعداد كمفتاح؛ وتضيف تقسيمات CI ذات نمط التضمين اسم التقسيم حتى يمكن تتبع التقسيمات المفلترة بشكل منفصل. + - عندما لا يزال اختبار ساخن واحد يقضي معظم وقته في استيرادات بدء التشغيل، أبقِ الاعتماديات الثقيلة خلف حد محلي ضيق `*.runtime.ts` واستهزئ بذلك الحد مباشرة بدلًا من الاستيراد العميق لمساعدي وقت التشغيل لمجرد تمريرهم عبر `vi.mock(...)`. + - يقارن `pnpm test:perf:changed:bench -- --ref ` تشغيل `test:changed` الموجّه مع مسار مشروع الجذر الأصلي لذلك الفرق الملتزَم، ويطبع زمن الجدار بالإضافة إلى الحد الأقصى لـ RSS على macOS. + - يقيس `pnpm test:perf:changed:bench -- --worktree` الشجرة المتسخة الحالية من خلال توجيه قائمة الملفات المتغيرة عبر `scripts/test-projects.mjs` وإعداد Vitest الجذري. + - يكتب `pnpm test:perf:profile:main` ملف تعريف CPU للخيط الرئيسي لتكاليف بدء تشغيل Vitest/Vite والتحويل. + - يكتب `pnpm test:perf:profile:runner` ملفات تعريف CPU+heap للمشغّل لحزمة الوحدات مع تعطيل توازي الملفات. @@ -464,136 +464,137 @@ pnpm openclaw qa credentials remove --credential-id - الأمر: `pnpm test:stability:gateway` - الإعداد: `vitest.gateway.config.ts`، مفروض على عامل واحد - النطاق: - - يبدأ Gateway حقيقيًا عبر local loopback مع تفعيل التشخيصات افتراضيًا - - يمرر اضطراب رسائل Gateway الاصطناعية والذاكرة والحمولات الكبيرة عبر مسار حدث التشخيص + - يبدأ Gateway حقيقيًا عبر loopback مع تمكين التشخيصات افتراضيًا + - يدفع اضطراب رسائل Gateway والذاكرة والحمولات الكبيرة الاصطناعية عبر مسار أحداث التشخيص - يستعلم عن `diagnostics.stability` عبر Gateway WS RPC - - يغطي مساعدات استمرارية حزمة استقرار التشخيصات - - يتحقق من أن المسجّل يبقى محدودًا، وأن عينات RSS الاصطناعية تبقى دون ميزانية الضغط، وأن أعماق الطوابير لكل جلسة تعود إلى الصفر + - يغطي مساعدي استمرارية حزمة استقرار التشخيص + - يؤكد أن المسجل يبقى محدودًا، وأن عينات RSS الاصطناعية تبقى تحت ميزانية الضغط، وأن أعماق قوائم الانتظار لكل جلسة تعود إلى الصفر - التوقعات: - - آمن لـ CI ولا يحتاج إلى مفاتيح - - مسار ضيق لمتابعة ارتدادات الاستقرار، وليس بديلًا عن مجموعة Gateway الكاملة + - آمن لـ CI ولا يحتاج مفاتيح + - مسار ضيق لمتابعة انحدار الاستقرار، وليس بديلًا لحزمة Gateway الكاملة -### E2E (اختبار دخان Gateway) +### E2E (فحص Gateway smoke) - الأمر: `pnpm test:e2e` - الإعداد: `vitest.e2e.config.ts` -- الملفات: `src/**/*.e2e.test.ts` و`test/**/*.e2e.test.ts` واختبارات E2E للـ bundled-plugin ضمن `extensions/` -- افتراضيات وقت التشغيل: - - يستخدم `threads` في Vitest مع `isolate: false`، بما يطابق بقية المستودع. +- الملفات: `src/**/*.e2e.test.ts` و`test/**/*.e2e.test.ts` واختبارات E2E للإضافات المضمّنة ضمن `extensions/` +- افتراضات وقت التشغيل: + - يستخدم Vitest `threads` مع `isolate: false`، مطابقًا لبقية المستودع. - يستخدم عاملين تكيّفيين (CI: حتى 2، محليًا: 1 افتراضيًا). - - يعمل في الوضع الصامت افتراضيًا لتقليل كلفة I/O في وحدة التحكم. -- التجاوزات المفيدة: + - يعمل في النمط الصامت افتراضيًا لتقليل تكلفة إدخال/إخراج وحدة التحكم. +- تجاوزات مفيدة: - `OPENCLAW_E2E_WORKERS=` لفرض عدد العاملين (بحد أقصى 16). - - `OPENCLAW_E2E_VERBOSE=1` لإعادة تفعيل إخراج وحدة التحكم المفصل. + - `OPENCLAW_E2E_VERBOSE=1` لإعادة تمكين مخرجات وحدة التحكم التفصيلية. - النطاق: - - سلوك Gateway متعدد النسخ من البداية إلى النهاية - - أسطح WebSocket/HTTP، واقتران node، والشبكات الأثقل + - سلوك Gateway من طرف إلى طرف متعدد المثيلات + - أسطح WebSocket/HTTP، واقتران Node، والشبكات الأثقل - التوقعات: - - يعمل في CI (عند تفعيله في pipeline) - - لا تتطلب مفاتيح حقيقية - - يحتوي على أجزاء متحركة أكثر من اختبارات الوحدات (قد يكون أبطأ) + - يعمل في CI (عند تمكينه في خط الأنابيب) + - لا يتطلب مفاتيح حقيقية + - أجزاء متحركة أكثر من اختبارات الوحدات (قد يكون أبطأ) -### E2E: اختبار دخان خلفية OpenShell +### E2E: فحص smoke لخلفية OpenShell - الأمر: `pnpm test:e2e:openshell` - الملف: `extensions/openshell/src/backend.e2e.test.ts` - النطاق: - - يبدأ OpenShell gateway معزولًا على المضيف عبر Docker + - يبدأ Gateway OpenShell معزولًا على المضيف عبر Docker - ينشئ sandbox من Dockerfile محلي مؤقت - - يختبر خلفية OpenShell الخاصة بـ OpenClaw عبر `sandbox ssh-config` + تنفيذ SSH حقيقيين - - يتحقق من سلوك نظام الملفات القانوني عن بُعد عبر جسر sandbox fs + - يمرّن خلفية OpenShell في OpenClaw عبر `sandbox ssh-config` حقيقي + تنفيذ SSH + - يتحقق من سلوك نظام الملفات الكنسي البعيد عبر جسر sandbox fs - التوقعات: - اختياري فقط؛ ليس جزءًا من تشغيل `pnpm test:e2e` الافتراضي - - يتطلب CLI محليًا باسم `openshell` بالإضافة إلى Docker daemon عامل + - يتطلب CLI `openshell` محليًا بالإضافة إلى daemon Docker عامل - يستخدم `HOME` / `XDG_CONFIG_HOME` معزولين، ثم يدمّر Gateway الاختبار وsandbox -- التجاوزات المفيدة: - - `OPENCLAW_E2E_OPENSHELL=1` لتفعيل الاختبار عند تشغيل مجموعة e2e الأوسع يدويًا - - `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` للإشارة إلى ثنائي CLI أو سكربت تغليف غير افتراضي +- تجاوزات مفيدة: + - `OPENCLAW_E2E_OPENSHELL=1` لتمكين الاختبار عند تشغيل حزمة e2e الأوسع يدويًا + - `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` للإشارة إلى ثنائي CLI غير افتراضي أو نص غلاف ### حي (مزودون حقيقيون + نماذج حقيقية) - الأمر: `pnpm test:live` - الإعداد: `vitest.live.config.ts` -- الملفات: `src/**/*.live.test.ts` و`test/**/*.live.test.ts` واختبارات live للـ bundled-plugin ضمن `extensions/` +- الملفات: `src/**/*.live.test.ts` و`test/**/*.live.test.ts` واختبارات الحية للإضافات المضمّنة ضمن `extensions/` - الافتراضي: **مفعّل** بواسطة `pnpm test:live` (يضبط `OPENCLAW_LIVE_TEST=1`) - النطاق: - - "هل يعمل هذا المزود/النموذج فعليًا _اليوم_ باستخدام بيانات اعتماد حقيقية؟" - - التقاط تغييرات تنسيق المزودين، وغرائب استدعاء الأدوات، ومشكلات المصادقة، وسلوك حدود المعدل + - «هل يعمل هذا المزود/النموذج فعلًا _اليوم_ باستخدام بيانات اعتماد حقيقية؟» + - التقاط تغييرات تنسيق المزود، وغرائب استدعاء الأدوات، ومشكلات المصادقة، وسلوك حدود المعدل - التوقعات: - - غير مستقر في CI حسب التصميم (شبكات حقيقية، وسياسات مزودين حقيقية، وحصص، وانقطاعات) - - يكلّف مالًا / يستخدم حدود المعدل - - يُفضّل تشغيل مجموعات فرعية ضيقة بدلًا من "كل شيء" -- تستورد التشغيلات الحية `~/.profile` لالتقاط مفاتيح API المفقودة. -- افتراضيًا، ما زالت التشغيلات الحية تعزل `HOME` وتنسخ مواد config/auth إلى منزل اختبار مؤقت بحيث لا تستطيع fixtures الوحدات تعديل `~/.openclaw` الحقيقي لديك. -- عيّن `OPENCLAW_LIVE_USE_REAL_HOME=1` فقط عندما تحتاج عمدًا إلى أن تستخدم الاختبارات الحية دليل المنزل الحقيقي لديك. -- أصبح `pnpm test:live` افتراضيًا في وضع أهدأ: فهو يبقي إخراج التقدم `[live] ...`، لكنه يكتم إشعار `~/.profile` الإضافي ويصمت سجلات تمهيد Gateway وضجيج Bonjour. عيّن `OPENCLAW_LIVE_TEST_QUIET=0` إذا أردت استعادة سجلات بدء التشغيل الكاملة. -- تدوير مفاتيح API (خاص بالمزود): عيّن `*_API_KEYS` بصيغة الفاصلة/الفاصلة المنقوطة أو `*_API_KEY_1` و`*_API_KEY_2` (مثل `OPENAI_API_KEYS` و`ANTHROPIC_API_KEYS` و`GEMINI_API_KEYS`) أو تجاوزًا لكل تشغيل حي عبر `OPENCLAW_LIVE_*_KEY`؛ تعيد الاختبارات المحاولة عند استجابات حدود المعدل. -- إخراج التقدم/Heartbeat: - - تبث المجموعات الحية الآن أسطر تقدم إلى stderr بحيث تبقى استدعاءات المزود الطويلة نشطة بصريًا حتى عندما يكون التقاط وحدة تحكم Vitest هادئًا. - - يعطّل `vitest.live.config.ts` اعتراض وحدة تحكم Vitest بحيث تتدفق أسطر تقدم المزود/Gateway فورًا أثناء التشغيلات الحية. + - ليس مستقرًا لـ CI حسب التصميم (شبكات حقيقية، سياسات مزودين حقيقية، حصص، انقطاعات) + - يكلف مالًا / يستخدم حدود المعدل + - يُفضّل تشغيل مجموعات فرعية ضيقة بدلًا من «كل شيء» +- تستورد التشغيلات الحية `~/.profile` لالتقاط مفاتيح API الناقصة. +- افتراضيًا، لا تزال التشغيلات الحية تعزل `HOME` وتنسخ مواد الإعداد/المصادقة إلى منزل اختبار مؤقت حتى لا تتمكن تجهيزات الوحدات من تعديل `~/.openclaw` الحقيقي لديك. +- عيّن `OPENCLAW_LIVE_USE_REAL_HOME=1` فقط عندما تحتاج عمدًا إلى أن تستخدم الاختبارات الحية دليلك المنزلي الحقيقي. +- أصبح `pnpm test:live` افتراضيًا على نمط أهدأ: يبقي مخرجات تقدم `[live] ...`، لكنه يكتم إشعار `~/.profile` الإضافي ويكتم سجلات تمهيد Gateway/ثرثرة Bonjour. عيّن `OPENCLAW_LIVE_TEST_QUIET=0` إذا أردت استعادة سجلات بدء التشغيل الكاملة. +- تدوير مفاتيح API (خاص بالمزود): عيّن `*_API_KEYS` بتنسيق الفواصل/الفواصل المنقوطة أو `*_API_KEY_1`، `*_API_KEY_2` (مثلًا `OPENAI_API_KEYS`، `ANTHROPIC_API_KEYS`، `GEMINI_API_KEYS`) أو تجاوزًا لكل اختبار حي عبر `OPENCLAW_LIVE_*_KEY`؛ تعيد الاختبارات المحاولة عند استجابات حدود المعدل. +- مخرجات التقدم/Heartbeat: + - تصدر الحِزم الحية الآن أسطر تقدم إلى stderr بحيث تكون استدعاءات المزود الطويلة نشطة بشكل مرئي حتى عندما يكون التقاط وحدة تحكم Vitest هادئًا. + - يعطّل `vitest.live.config.ts` اعتراض وحدة التحكم في Vitest بحيث تتدفق أسطر تقدم المزود/Gateway فورًا أثناء التشغيلات الحية. - اضبط Heartbeat للنموذج المباشر باستخدام `OPENCLAW_LIVE_HEARTBEAT_MS`. - - اضبط Heartbeat الخاص بـ Gateway/probe باستخدام `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. + - اضبط Heartbeat للـ Gateway/المسبار باستخدام `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. -## أي مجموعة يجب أن أشغّل؟ +## أي حزمة ينبغي أن أشغّل؟ استخدم جدول القرار هذا: -- تعديل المنطق/الاختبارات: شغّل `pnpm test` (و`pnpm test:coverage` إذا غيّرت الكثير) -- لمس شبكات Gateway / بروتوكول WS / الاقتران: أضف `pnpm test:e2e` -- تصحيح “روبوتي معطل” / إخفاقات خاصة بالمزوّد / استدعاء الأدوات: شغّل `pnpm test:live` محدود النطاق +- عند تعديل المنطق/الاختبارات: شغّل `pnpm test` (و`pnpm test:coverage` إذا غيّرت الكثير) +- عند لمس شبكات Gateway / بروتوكول WS / الاقتران: أضف `pnpm test:e2e` +- عند تصحيح "روبوتي متوقف" / إخفاقات خاصة بالمزوّد / استدعاء الأدوات: شغّل `pnpm test:live` محدّد النطاق -## الاختبارات المباشرة (التي تلامس الشبكة) +## الاختبارات المباشرة (التي تلمس الشبكة) -لمصفوفة النماذج المباشرة، واختبارات smoke لواجهة CLI الخلفية، واختبارات smoke لـ ACP، وحاضنة خادم تطبيق Codex، وكل اختبارات مزوّدي الوسائط المباشرة (Deepgram، BytePlus، ComfyUI، الصور، الموسيقى، الفيديو، حاضنة الوسائط) — إضافة إلى التعامل مع بيانات الاعتماد للتشغيلات المباشرة — راجع +لمصفوفة النماذج المباشرة، واختبارات دخان خلفية CLI، واختبارات دخان ACP، وحزمة اختبار خادم تطبيق Codex، وكل اختبارات مزوّدي الوسائط المباشرة (Deepgram، وBytePlus، وComfyUI، والصور، والموسيقى، والفيديو، وحزمة اختبار الوسائط) — بالإضافة إلى التعامل مع بيانات الاعتماد للتشغيلات المباشرة — راجع [الاختبار — الحزم المباشرة](/ar/help/testing-live). -## مشغّلات Docker (فحوصات اختيارية لـ "هل يعمل في Linux") +## مشغّلات Docker (فحوص اختيارية "تعمل في Linux") تنقسم مشغّلات Docker هذه إلى مجموعتين: -- مشغّلات النماذج المباشرة: يشغّل `test:docker:live-models` و`test:docker:live-gateway` ملفهما المباشر المطابق لمفتاح الملف الشخصي فقط داخل صورة Docker الخاصة بالمستودع (`src/agents/models.profiles.live.test.ts` و`src/gateway/gateway-models.profiles.live.test.ts`)، مع تركيب دليل الإعداد المحلي ومساحة العمل لديك (ومصدر `~/.profile` إذا كان مركّبًا). نقاط الدخول المحلية المطابقة هي `test:live:models-profiles` و`test:live:gateway-profiles`. -- تعتمد مشغّلات Docker المباشرة حد smoke أصغر افتراضيًا حتى يظل مسح Docker الكامل عمليًا: - يكون `test:docker:live-models` افتراضيًا `OPENCLAW_LIVE_MAX_MODELS=12`، ويكون - `test:docker:live-gateway` افتراضيًا `OPENCLAW_LIVE_GATEWAY_SMOKE=1`، - `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8`، - `OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000`، و - `OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. تجاوز متغيرات البيئة هذه عندما تريد صراحةً - الفحص الشامل الأكبر. -- يبني `test:docker:all` صورة Docker المباشرة مرة واحدة عبر `test:docker:live-build`، ويحزم OpenClaw مرة واحدة كأرشيف npm tarball من خلال `scripts/package-openclaw-for-docker.mjs`، ثم يبني/يعيد استخدام صورتين من `scripts/e2e/Dockerfile`. الصورة المجردة هي فقط مشغّل Node/Git لمسارات التثبيت/التحديث/اعتمادية Plugin؛ تركّب تلك المسارات الأرشيف المسبق البناء. تثبّت الصورة الوظيفية الأرشيف نفسه في `/app` لمسارات وظائف التطبيق المبني. تعيش تعريفات مسارات Docker في `scripts/lib/docker-e2e-scenarios.mjs`؛ ويعيش منطق المخطِّط في `scripts/lib/docker-e2e-plan.mjs`؛ وينفّذ `scripts/test-docker-all.mjs` الخطة المحددة. يستخدم التجميع مجدولًا محليًا موزونًا: يتحكم `OPENCLAW_DOCKER_ALL_PARALLELISM` في خانات العمليات، بينما تمنع حدود الموارد مسارات live الثقيلة، وتثبيت npm، والمسارات متعددة الخدمات من البدء جميعًا في الوقت نفسه. إذا كان مسار واحد أثقل من الحدود النشطة، فلا يزال بإمكان المجدول بدءه عندما يكون المجمّع فارغًا ثم يبقيه يعمل وحده حتى تتوفر السعة مرة أخرى. الافتراضيات هي 10 خانات، و`OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9`، و`OPENCLAW_DOCKER_ALL_NPM_LIMIT=10`، و`OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7`؛ اضبط `OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT` أو `OPENCLAW_DOCKER_ALL_DOCKER_LIMIT` فقط عندما يملك مضيف Docker مساحة أكبر. ينفّذ المشغّل فحصًا تمهيديًا لـ Docker افتراضيًا، ويزيل حاويات OpenClaw E2E القديمة، ويطبع الحالة كل 30 ثانية، ويخزّن توقيتات المسارات الناجحة في `.artifacts/docker-tests/lane-timings.json`، ويستخدم تلك التوقيتات لبدء المسارات الأطول أولًا في التشغيلات اللاحقة. استخدم `OPENCLAW_DOCKER_ALL_DRY_RUN=1` لطباعة بيان المسارات الموزون من دون بناء أو تشغيل Docker، أو `node scripts/test-docker-all.mjs --plan-json` لطباعة خطة CI للمسارات المحددة، واحتياجات الحزمة/الصورة، وبيانات الاعتماد. -- `Package Acceptance` هو بوابة الحزمة الأصلية في GitHub لسؤال "هل يعمل هذا الأرشيف القابل للتثبيت كمنتج؟" يحل حزمة مرشحة واحدة من `source=npm` أو `source=ref` أو `source=url` أو `source=artifact`، ويرفعها باسم `package-under-test`، ثم يشغّل مسارات Docker E2E القابلة لإعادة الاستخدام على ذلك الأرشيف نفسه بدلًا من إعادة حزم المرجع المحدد. يحدد `workflow_ref` نصوص سير العمل/الحاضنة الموثوقة، بينما يحدد `package_ref` commit/branch/tag المصدر للحزم عندما يكون `source=ref`؛ وهذا يتيح لمنطق القبول الحالي التحقق من commits موثوقة أقدم. ترتّب الملفات الشخصية حسب الاتساع: `smoke` سريع للتثبيت/القناة/الوكيل إضافة إلى gateway/config، و`package` هو عقد الحزمة/التحديث/Plugin والبديل الأصلي الافتراضي لمعظم تغطية الحزمة/التحديث في Parallels، ويضيف `product` قنوات MCP، وتنظيف cron/subagent، وبحث OpenAI على الويب، وOpenWebUI، ويشغّل `full` مقاطع Docker لمسار الإصدار مع OpenWebUI. يشغّل تحقق الإصدار دلتا حزمة مخصصة (`bundled-channel-deps-compat plugins-offline`) إضافة إلى ضمان جودة حزمة Telegram لأن مقاطع Docker لمسار الإصدار تغطي بالفعل مسارات الحزمة/التحديث/Plugin المتداخلة. تتضمن أوامر إعادة تشغيل Docker المستهدفة في GitHub والمولّدة من artifacts مدخلات أثر الحزمة السابق والصور المحضّرة عند توفرها، حتى تتمكن المسارات الفاشلة من تجنب إعادة بناء الحزمة والصور. -- تشغّل فحوصات البناء والإصدار `scripts/check-cli-bootstrap-imports.mjs` بعد tsdown. يمشي الحارس على الرسم البياني المبني الثابت من `dist/entry.js` و`dist/cli/run-main.js` ويفشل إذا استورد بدء التشغيل قبل التوجيه اعتماديات حزم مثل Commander، أو واجهة المطالبة، أو undici، أو التسجيل قبل توجيه الأمر؛ كما يُبقي مقطع تشغيل Gateway المضمّن ضمن الميزانية ويرفض الاستيرادات الثابتة لمسارات Gateway الباردة المعروفة. يغطي smoke الخاص بواجهة CLI المعبأة أيضًا مساعدة الجذر، ومساعدة onboard، ومساعدة doctor، وstatus، ومخطط config، وأمر قائمة نماذج. -- توافق `Package Acceptance` القديم محدود عند `2026.4.25` (بما في ذلك `2026.4.25-beta.*`). حتى ذلك الحد، تتسامح الحاضنة فقط مع فجوات بيانات تعريف الحزم المشحونة: إدخالات مخزون QA الخاصة المحذوفة، وغياب `gateway install --wrapper`، وغياب ملفات التصحيح في تجهيز git المشتق من الأرشيف، وغياب `update.channel` المستمر، ومواقع سجل تثبيت Plugin القديمة، وغياب استمرار سجل تثبيت السوق، وترحيل بيانات تعريف config أثناء `plugins update`. بالنسبة للحزم بعد `2026.4.25`، تكون تلك المسارات إخفاقات صارمة. -- مشغّلات smoke للحاويات: يشغّل `test:docker:openwebui`، و`test:docker:onboard`، و`test:docker:npm-onboard-channel-agent`، و`test:docker:update-channel-switch`، و`test:docker:session-runtime-context`، و`test:docker:agents-delete-shared-workspace`، و`test:docker:gateway-network`، و`test:docker:browser-cdp-snapshot`، و`test:docker:mcp-channels`، و`test:docker:pi-bundle-mcp-tools`، و`test:docker:cron-mcp-cleanup`، و`test:docker:plugins`، و`test:docker:plugin-update`، و`test:docker:config-reload` حاوية حقيقية واحدة أو أكثر ويتحقق من مسارات تكامل أعلى مستوى. +- مشغّلات النماذج المباشرة: يشغّل `test:docker:live-models` و`test:docker:live-gateway` فقط ملفهما المباشر المطابق لمفتاح الملف الشخصي داخل صورة Docker الخاصة بالمستودع (`src/agents/models.profiles.live.test.ts` و`src/gateway/gateway-models.profiles.live.test.ts`)، مع تحميل دليل الإعدادات المحلي ومساحة العمل لديك (واستدعاء `~/.profile` إذا كان محمّلاً). نقاط الدخول المحلية المطابقة هي `test:live:models-profiles` و`test:live:gateway-profiles`. +- تستخدم مشغّلات Docker المباشرة افتراضياً حد دخان أصغر حتى يبقى المسح الكامل عبر Docker عملياً: + يستخدم `test:docker:live-models` افتراضياً `OPENCLAW_LIVE_MAX_MODELS=12`، ويستخدم + `test:docker:live-gateway` افتراضياً `OPENCLAW_LIVE_GATEWAY_SMOKE=1`، + و`OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8`، + و`OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000`، و + `OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. تجاوز متغيرات البيئة هذه عندما تريد + صراحةً المسح الشامل الأكبر. +- يبني `test:docker:all` صورة Docker المباشرة مرة واحدة عبر `test:docker:live-build`، ويحزم OpenClaw مرة واحدة كحزمة npm tarball عبر `scripts/package-openclaw-for-docker.mjs`، ثم يبني/يعيد استخدام صورتين من `scripts/e2e/Dockerfile`. الصورة الأساسية هي فقط مشغّل Node/Git لمسارات التثبيت/التحديث/اعتمادات Plugin؛ وتحمّل تلك المسارات ملف tarball المبني مسبقاً. تثبّت الصورة الوظيفية ملف tarball نفسه في `/app` لمسارات وظائف التطبيق المبني. توجد تعريفات مسارات Docker في `scripts/lib/docker-e2e-scenarios.mjs`؛ ويقع منطق التخطيط في `scripts/lib/docker-e2e-plan.mjs`؛ وينفّذ `scripts/test-docker-all.mjs` الخطة المحددة. يستخدم التجميع مجدولاً محلياً مرجّحاً: يتحكم `OPENCLAW_DOCKER_ALL_PARALLELISM` في خانات العمليات، بينما تمنع حدود الموارد مسارات التشغيل المباشر الثقيلة، وتثبيت npm، والمسارات متعددة الخدمات من البدء كلها مرة واحدة. إذا كان مسار واحد أثقل من الحدود النشطة، يستطيع المجدول مع ذلك بدءه عندما يكون المجمّع فارغاً، ثم يبقيه يعمل وحده حتى تتاح السعة مرة أخرى. القيم الافتراضية هي 10 خانات، و`OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9`، و`OPENCLAW_DOCKER_ALL_NPM_LIMIT=10`، و`OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7`؛ اضبط `OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT` أو `OPENCLAW_DOCKER_ALL_DOCKER_LIMIT` فقط عندما يكون لدى مضيف Docker سعة إضافية. يجري المشغّل فحصاً تمهيدياً لـ Docker افتراضياً، ويزيل حاويات OpenClaw E2E القديمة، ويطبع الحالة كل 30 ثانية، ويخزن توقيتات المسارات الناجحة في `.artifacts/docker-tests/lane-timings.json`، ويستخدم تلك التوقيتات لبدء المسارات الأطول أولاً في التشغيلات اللاحقة. استخدم `OPENCLAW_DOCKER_ALL_DRY_RUN=1` لطباعة بيان المسارات المرجّح دون بناء Docker أو تشغيله، أو `node scripts/test-docker-all.mjs --plan-json` لطباعة خطة CI للمسارات المحددة، واحتياجات الحزم/الصور، وبيانات الاعتماد. +- `Package Acceptance` هو بوابة الحزم الأصلية في GitHub لسؤال "هل تعمل هذه الحزمة القابلة للتثبيت كمنتج؟" يحدد حزمة مرشحة واحدة من `source=npm`، أو `source=ref`، أو `source=url`، أو `source=artifact`، ويرفعها باسم `package-under-test`، ثم يشغّل مسارات Docker E2E القابلة لإعادة الاستخدام على ملف tarball نفسه بدلاً من إعادة حزم المرجع المحدد. يحدد `workflow_ref` سكربتات سير العمل/حزمة الاختبار الموثوقة، بينما يحدد `package_ref` التثبيت/الفرع/الوسم المصدري المراد حزمه عند `source=ref`؛ يتيح هذا لمنطق القبول الحالي التحقق من تثبيتات موثوقة أقدم. تُرتّب الملفات الشخصية حسب الاتساع: `smoke` تثبيت/قناة/وكيل سريع بالإضافة إلى Gateway/الإعدادات، و`package` عقد الحزمة/التحديث/Plugin بالإضافة إلى تجهيز ناجي الترقية بدون مفاتيح والبديل الأصلي الافتراضي لمعظم تغطية حزم/تحديثات Parallels، و`product` يضيف قنوات MCP، وتنظيف cron/الوكيل الفرعي، وبحث OpenAI على الويب، وOpenWebUI، و`full` يشغّل أجزاء Docker الخاصة بمسار الإصدار مع OpenWebUI. يشغّل تحقق الإصدار دلتا حزمة مخصصة (`bundled-channel-deps-compat plugins-offline`) بالإضافة إلى QA حزمة Telegram لأن أجزاء Docker الخاصة بمسار الإصدار تغطي بالفعل مسارات الحزمة/التحديث/Plugin المتداخلة. تتضمن أوامر إعادة تشغيل Docker المستهدفة في GitHub والمولّدة من القطع الأثرية مدخلات قطعة الحزمة الأثرية السابقة والصور المجهزة عندما تكون متاحة، بحيث تستطيع المسارات الفاشلة تجنب إعادة بناء الحزمة والصور. +- تشغّل فحوص البناء والإصدار `scripts/check-cli-bootstrap-imports.mjs` بعد tsdown. يجتاز الحارس الرسم البياني المبني الثابت من `dist/entry.js` و`dist/cli/run-main.js` ويفشل إذا استورد بدء التشغيل قبل الإرسال اعتمادات حزم مثل Commander، أو واجهة مطالبات المستخدم، أو undici، أو التسجيل قبل إرسال الأمر؛ كما يحافظ على جزء تشغيل Gateway المضمّن ضمن الميزانية ويرفض الاستيرادات الثابتة لمسارات Gateway الباردة المعروفة. يغطي دخان CLI المعبأ أيضاً مساعدة الجذر، ومساعدة onboard، ومساعدة doctor، والحالة، ومخطط الإعدادات، وأمراً لسرد النماذج. +- توافق `Package Acceptance` القديم محدود عند `2026.4.25` (بما في ذلك `2026.4.25-beta.*`). حتى ذلك الحد، تتسامح حزمة الاختبار فقط مع فجوات بيانات تعريف الحزم التي شُحنت: إدخالات مخزون QA الخاصة المحذوفة، وغياب `gateway install --wrapper`، وغياب ملفات التصحيح في تجهيز git المشتق من ملف tarball، وغياب `update.channel` المستمر، ومواقع سجلات تثبيت Plugin القديمة، وغياب استمرار سجلات تثبيت marketplace، وترحيل بيانات تعريف الإعدادات أثناء `plugins update`. بالنسبة للحزم بعد `2026.4.25`، تكون هذه المسارات إخفاقات صارمة. +- مشغّلات دخان الحاويات: يشغّل `test:docker:openwebui`، و`test:docker:onboard`، و`test:docker:npm-onboard-channel-agent`، و`test:docker:update-channel-switch`، و`test:docker:upgrade-survivor`، و`test:docker:session-runtime-context`، و`test:docker:agents-delete-shared-workspace`، و`test:docker:gateway-network`، و`test:docker:browser-cdp-snapshot`، و`test:docker:mcp-channels`، و`test:docker:pi-bundle-mcp-tools`، و`test:docker:cron-mcp-cleanup`، و`test:docker:plugins`، و`test:docker:plugin-update`، و`test:docker:config-reload` حاوية حقيقية واحدة أو أكثر ويتحقق من مسارات التكامل الأعلى مستوى. -تركّب مشغّلات Docker للنماذج المباشرة أيضًا منازل مصادقة CLI المطلوبة فقط (أو كل المنازل المدعومة عندما لا يكون التشغيل محدود النطاق)، ثم تنسخها إلى منزل الحاوية قبل التشغيل حتى تتمكن OAuth الخاصة بواجهات CLI الخارجية من تحديث الرموز من دون تعديل مخزن مصادقة المضيف: +تربط مشغّلات Docker للنماذج المباشرة أيضاً مجلدات اعتماد CLI المطلوبة فقط (أو كل المجلدات المدعومة عندما لا يكون التشغيل محدد النطاق)، ثم تنسخها إلى مجلد المنزل داخل الحاوية قبل التشغيل حتى يستطيع OAuth الخاص بـ CLI الخارجي تحديث الرموز دون تعديل مخزن الاعتماد على المضيف: - النماذج المباشرة: `pnpm test:docker:live-models` (السكريبت: `scripts/test-live-models-docker.sh`) - اختبار دخان ربط ACP: `pnpm test:docker:live-acp-bind` (السكريبت: `scripts/test-live-acp-bind-docker.sh`؛ يغطي Claude وCodex وGemini افتراضيا، مع تغطية صارمة لـ Droid/OpenCode عبر `pnpm test:docker:live-acp-bind:droid` و`pnpm test:docker:live-acp-bind:opencode`) -- اختبار دخان خلفية CLI: `pnpm test:docker:live-cli-backend` (السكريبت: `scripts/test-live-cli-backend-docker.sh`) -- اختبار دخان حزمة خادم تطبيق Codex: `pnpm test:docker:live-codex-harness` (السكريبت: `scripts/test-live-codex-harness-docker.sh`) +- اختبار دخان واجهة خلفية CLI: `pnpm test:docker:live-cli-backend` (السكريبت: `scripts/test-live-cli-backend-docker.sh`) +- اختبار دخان مسخّر خادم تطبيق Codex: `pnpm test:docker:live-codex-harness` (السكريبت: `scripts/test-live-codex-harness-docker.sh`) - Gateway + وكيل التطوير: `pnpm test:docker:live-gateway` (السكريبت: `scripts/test-live-gateway-models-docker.sh`) -- اختبار دخان قابلية الملاحظة: `pnpm qa:otel:smoke` هو مسار تحقق خاص من مصدر QA checkout. وهو ليس جزءا من مسارات إصدار Docker للحزمة عمدا لأن ملف npm tarball يحذف QA Lab. -- اختبار دخان Open WebUI المباشر: `pnpm test:docker:openwebui` (السكريبت: `scripts/e2e/openwebui-docker.sh`) -- معالج الإعداد الأولي (TTY، سقالات كاملة): `pnpm test:docker:onboard` (السكريبت: `scripts/e2e/onboard-docker.sh`) -- اختبار دخان الإعداد الأولي/القناة/الوكيل لملف npm tarball: `pnpm test:docker:npm-onboard-channel-agent` يثبت ملف OpenClaw tarball المعبأ عالميا في Docker، ويكوّن OpenAI عبر إعداد أولي بمرجع env بالإضافة إلى Telegram افتراضيا، ويتحقق من أن doctor أصلح اعتماديات تشغيل Plugin المفعلة، ويشغل دورة وكيل OpenAI واحدة محاكية. أعد استخدام ملف tarball مبنيا مسبقا باستخدام `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz`، أو تخط إعادة بناء المضيف باستخدام `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0`، أو بدّل القناة باستخدام `OPENCLAW_NPM_ONBOARD_CHANNEL=discord`. -- اختبار دخان تبديل قناة التحديث: `pnpm test:docker:update-channel-switch` يثبت ملف OpenClaw tarball المعبأ عالميا في Docker، ويبدّل من الحزمة `stable` إلى git `dev`، ويتحقق من القناة المحفوظة وعمل Plugin بعد التحديث، ثم يعود إلى الحزمة `stable` ويفحص حالة التحديث. -- اختبار دخان سياق تشغيل الجلسة: `pnpm test:docker:session-runtime-context` يتحقق من استمرار نص سياق التشغيل المخفي بالإضافة إلى إصلاح doctor لفروع إعادة كتابة المطالبات المكررة المتأثرة. -- اختبار دخان التثبيت العالمي عبر Bun: `bash scripts/e2e/bun-global-install-smoke.sh` يحزم الشجرة الحالية، ويثبتها باستخدام `bun install -g` في home معزولة، ويتحقق من أن `openclaw infer image providers --json` يعيد مزودي الصور المضمنين بدلا من التعليق. أعد استخدام ملف tarball مبنيا مسبقا باستخدام `OPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz`، أو تخط بناء المضيف باستخدام `OPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0`، أو انسخ `dist/` من صورة Docker مبنية باستخدام `OPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local`. -- اختبار دخان Docker للمثبت: `bash scripts/test-install-sh-docker.sh` يشارك ذاكرة تخزين npm مؤقت واحدة بين حاويات root والتحديث وdirect-npm الخاصة به. اختبار دخان التحديث يستخدم npm `latest` افتراضيا كخط أساس مستقر قبل الترقية إلى ملف tarball المرشح. تجاوزه باستخدام `OPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22` محليا، أو باستخدام إدخال `update_baseline_version` الخاص بسير عمل Install Smoke على GitHub. تحتفظ فحوصات المثبت غير الجذرية بذاكرة تخزين npm مؤقت معزولة حتى لا تخفي إدخالات الذاكرة المؤقتة المملوكة للجذر سلوك التثبيت المحلي للمستخدم. اضبط `OPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache` لإعادة استخدام ذاكرة التخزين المؤقت root/update/direct-npm عبر إعادات التشغيل المحلية. -- يتخطى Install Smoke CI التحديث العالمي direct-npm المكرر باستخدام `OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1`؛ شغل السكريبت محليا بدون هذا env عندما تكون تغطية `npm install -g` المباشرة مطلوبة. -- اختبار دخان CLI لحذف الوكلاء لمساحة عمل مشتركة: `pnpm test:docker:agents-delete-shared-workspace` (السكريبت: `scripts/e2e/agents-delete-shared-workspace-docker.sh`) يبني صورة Dockerfile الجذرية افتراضيا، ويزرع وكيلين مع مساحة عمل واحدة في home حاوية معزولة، ويشغل `agents delete --json`، ويتحقق من JSON صالح بالإضافة إلى سلوك الاحتفاظ بمساحة العمل. أعد استخدام صورة install-smoke باستخدام `OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1`. +- اختبار دخان قابلية الملاحظة: `pnpm qa:otel:smoke` هو مسار خاص لضمان الجودة من نسخة مصدرية. لا يكون عمدا جزءا من مسارات إصدار Docker للحزمة لأن أرشيف npm يستثني QA Lab. +- اختبار دخان حي لـ Open WebUI: `pnpm test:docker:openwebui` (السكريبت: `scripts/e2e/openwebui-docker.sh`) +- معالج الإعداد الأولي (TTY، إنشاء هيكل كامل): `pnpm test:docker:onboard` (السكريبت: `scripts/e2e/onboard-docker.sh`) +- اختبار دخان أرشيف npm للإعداد الأولي/القناة/الوكيل: `pnpm test:docker:npm-onboard-channel-agent` يثبت أرشيف OpenClaw المحزم عالميا في Docker، ويضبط OpenAI عبر إعداد أولي بإحالة بيئية إضافة إلى Telegram افتراضيا، ويتحقق من أن doctor أصلح تبعيات وقت تشغيل Plugin المفعلة، ويشغّل دورة وكيل OpenAI واحدة بمحاكاة. أعد استخدام أرشيف مبني مسبقا عبر `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz`، أو تخط إعادة بناء المضيف عبر `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0`، أو بدّل القناة عبر `OPENCLAW_NPM_ONBOARD_CHANNEL=discord`. +- اختبار دخان تبديل قناة التحديث: `pnpm test:docker:update-channel-switch` يثبت أرشيف OpenClaw المحزم عالميا في Docker، ويبدّل من حزمة `stable` إلى git `dev`، ويتحقق من القناة المحفوظة وعمل Plugin بعد التحديث، ثم يبدّل عائدا إلى حزمة `stable` ويفحص حالة التحديث. +- اختبار دخان النجاة من الترقية: `pnpm test:docker:upgrade-survivor` يثبت أرشيف OpenClaw المحزم فوق تجهيز مستخدم قديم غير نظيف يتضمن وكلاء، وإعداد قناة، وقوائم سماح Plugin، وحالة قديمة لتبعيات وقت تشغيل Plugin، وملفات مساحة عمل/جلسة موجودة. يشغل تحديث الحزمة إضافة إلى doctor غير تفاعلي بلا مفاتيح مزود أو قناة حية، ثم يبدأ Gateway عبر local loopback ويفحص الحفاظ على الإعداد/الحالة إضافة إلى ميزانيات بدء التشغيل/الحالة. +- اختبار دخان سياق وقت تشغيل الجلسة: `pnpm test:docker:session-runtime-context` يتحقق من استمرار نص سياق وقت التشغيل المخفي إضافة إلى إصلاح doctor لفروع إعادة كتابة الموجّه المكررة المتأثرة. +- اختبار دخان تثبيت Bun عالمي: `bash scripts/e2e/bun-global-install-smoke.sh` يحزم الشجرة الحالية، ويثبتها باستخدام `bun install -g` في مجلد منزلي معزول، ويتحقق من أن `openclaw infer image providers --json` يعيد مزودي الصور المضمنين بدلا من التعليق. أعد استخدام أرشيف مبني مسبقا عبر `OPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz`، أو تخط بناء المضيف عبر `OPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0`، أو انسخ `dist/` من صورة Docker مبنية عبر `OPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local`. +- اختبار دخان مثبت Docker: `bash scripts/test-install-sh-docker.sh` يشارك ذاكرة تخزين npm مؤقتة واحدة بين حاويات الجذر والتحديث وdirect-npm. يعتمد اختبار دخان التحديث افتراضيا على npm `latest` كخط أساس مستقر قبل الترقية إلى الأرشيف المرشح. تجاوزه محليا عبر `OPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22`، أو عبر إدخال `update_baseline_version` في مسار عمل Install Smoke على GitHub. تحافظ فحوصات المثبت غير الجذري على ذاكرة تخزين npm مؤقتة معزولة كي لا تخفي إدخالات التخزين المملوكة للجذر سلوك التثبيت المحلي للمستخدم. عيّن `OPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache` لإعادة استخدام ذاكرة التخزين المؤقتة للجذر/التحديث/direct-npm عبر الإعادات المحلية. +- يتخطى Install Smoke CI تحديث direct-npm العالمي المكرر عبر `OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1`؛ شغّل السكريبت محليا من دون هذا المتغير البيئي عندما تكون تغطية `npm install -g` المباشرة مطلوبة. +- اختبار دخان CLI لحذف الوكلاء لمساحة عمل مشتركة: `pnpm test:docker:agents-delete-shared-workspace` (السكريبت: `scripts/e2e/agents-delete-shared-workspace-docker.sh`) يبني صورة Dockerfile الجذرية افتراضيا، ويزرع وكيلين بمساحة عمل واحدة في مجلد منزلي معزول داخل حاوية، ويشغل `agents delete --json`، ويتحقق من JSON صالح إضافة إلى سلوك الاحتفاظ بمساحة العمل. أعد استخدام صورة install-smoke عبر `OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1`. - شبكات Gateway (حاويتان، مصادقة WS + الصحة): `pnpm test:docker:gateway-network` (السكريبت: `scripts/e2e/gateway-network-docker.sh`) -- اختبار دخان لقطة Browser CDP: `pnpm test:docker:browser-cdp-snapshot` (السكريبت: `scripts/e2e/browser-cdp-snapshot-docker.sh`) يبني صورة E2E المصدر بالإضافة إلى طبقة Chromium، ويبدأ Chromium مع CDP خام، ويشغل `browser doctor --deep`، ويتحقق من أن لقطات أدوار CDP تغطي عناوين URL للروابط، والعناصر القابلة للنقر المرفوعة بالمؤشر، ومراجع iframe، وبيانات تعريف الإطار. -- انحدار الاستدلال الأدنى لـ OpenAI Responses web_search: `pnpm test:docker:openai-web-search-minimal` (السكريبت: `scripts/e2e/openai-web-search-minimal-docker.sh`) يشغل خادم OpenAI محاكيا عبر Gateway، ويتحقق من أن `web_search` يرفع `reasoning.effort` من `minimal` إلى `low`، ثم يجبر مخطط المزود على الرفض ويفحص ظهور التفاصيل الخام في سجلات Gateway. -- جسر قناة MCP (Gateway مزروع + جسر stdio + اختبار دخان لإطار إشعار Claude خام): `pnpm test:docker:mcp-channels` (السكريبت: `scripts/e2e/mcp-channels-docker.sh`) -- أدوات MCP لحزمة Pi (خادم stdio MCP حقيقي + اختبار دخان السماح/الرفض لملف Pi المضمن): `pnpm test:docker:pi-bundle-mcp-tools` (السكريبت: `scripts/e2e/pi-bundle-mcp-tools-docker.sh`) -- تنظيف Cron/subagent MCP (Gateway حقيقي + تفكيك ابن stdio MCP بعد تشغيلات cron معزولة وsubagent لمرة واحدة): `pnpm test:docker:cron-mcp-cleanup` (السكريبت: `scripts/e2e/cron-mcp-cleanup-docker.sh`) -- Plugins (اختبار دخان التثبيت، تثبيت/إلغاء تثبيت حزمة ClawHub شاملة، تحديثات marketplace، وتمكين/فحص حزمة Claude): `pnpm test:docker:plugins` (السكريبت: `scripts/e2e/plugins-docker.sh`) - اضبط `OPENCLAW_PLUGINS_E2E_CLAWHUB=0` لتخطي كتلة ClawHub، أو تجاوز زوج الحزمة/التشغيل الافتراضي الشامل باستخدام `OPENCLAW_PLUGINS_E2E_CLAWHUB_SPEC` و`OPENCLAW_PLUGINS_E2E_CLAWHUB_ID`. بدون `OPENCLAW_CLAWHUB_URL`/`CLAWHUB_URL`، يستخدم الاختبار خادم fixture محلي معزول لـ ClawHub. -- اختبار دخان تحديث Plugin بدون تغيير: `pnpm test:docker:plugin-update` (السكريبت: `scripts/e2e/plugin-update-unchanged-docker.sh`) -- اختبار دخان بيانات تعريف إعادة تحميل الإعدادات: `pnpm test:docker:config-reload` (السكريبت: `scripts/e2e/config-reload-source-docker.sh`) -- اعتماديات تشغيل Plugin المضمنة: `pnpm test:docker:bundled-channel-deps` يبني افتراضيا صورة مشغل Docker صغيرة، ويبني OpenClaw ويحزمه مرة واحدة على المضيف، ثم يثبت ملف tarball ذلك في كل سيناريو تثبيت Linux. أعد استخدام الصورة مع `OPENCLAW_SKIP_DOCKER_BUILD=1`، أو تخط إعادة بناء المضيف بعد بناء محلي حديث باستخدام `OPENCLAW_BUNDLED_CHANNEL_HOST_BUILD=0`، أو أشر إلى ملف tarball موجود باستخدام `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz`. يحزم تجميع Docker الكامل وأجزاء bundled-channel لمسار الإصدار ملف tarball هذا مرة واحدة مسبقا، ثم يجزئ فحوصات القنوات المضمنة إلى مسارات مستقلة، بما في ذلك مسارات تحديث منفصلة لـ Telegram وDiscord وSlack وFeishu وmemory-lancedb وACPX. تقسم أجزاء الإصدار اختبارات دخان القنوات، وأهداف التحديث، وعقود الإعداد/التشغيل إلى `bundled-channels-core` و`bundled-channels-update-a` و`bundled-channels-update-b` و`bundled-channels-contracts`؛ ويبقى جزء التجميع `bundled-channels` متاحا لإعادات التشغيل اليدوية. يقسم سير عمل الإصدار أيضا أجزاء مثبت المزود وأجزاء تثبيت/إلغاء تثبيت Plugin المضمنة؛ وتبقى أجزاء `package-update` و`plugins-runtime` و`plugins-integrations` القديمة أسماء مستعارة تجميعية لإعادات التشغيل اليدوية. استخدم `OPENCLAW_BUNDLED_CHANNELS=telegram,slack` لتضييق مصفوفة القنوات عند تشغيل المسار المضمن مباشرة، أو `OPENCLAW_BUNDLED_CHANNEL_UPDATE_TARGETS=telegram,acpx` لتضييق سيناريو التحديث. الإعداد الافتراضي لتشغيلات Docker لكل سيناريو هو `OPENCLAW_BUNDLED_CHANNEL_DOCKER_RUN_TIMEOUT=900s`؛ والإعداد الافتراضي لسيناريو التحديث متعدد الأهداف هو `OPENCLAW_BUNDLED_CHANNEL_UPDATE_DOCKER_RUN_TIMEOUT=2400s`. يتحقق المسار أيضا من أن `channels..enabled=false` و`plugins.entries..enabled=false` يكبحان إصلاح doctor/اعتماديات التشغيل. -- ضيق اعتماديات تشغيل Plugin المضمنة أثناء التكرار عن طريق تعطيل السيناريوهات غير ذات الصلة، مثلا: +- اختبار دخان لقطة Browser CDP: `pnpm test:docker:browser-cdp-snapshot` (السكريبت: `scripts/e2e/browser-cdp-snapshot-docker.sh`) يبني صورة E2E المصدرية إضافة إلى طبقة Chromium، ويبدأ Chromium مع CDP خام، ويشغل `browser doctor --deep`، ويتحقق من أن لقطات أدوار CDP تغطي روابط URL، والعناصر القابلة للنقر المرفوعة بالمؤشر، ومراجع iframe، وبيانات الإطار الوصفية. +- انحدار الاستدلال الأدنى في OpenAI Responses web_search: `pnpm test:docker:openai-web-search-minimal` (السكريبت: `scripts/e2e/openai-web-search-minimal-docker.sh`) يشغل خادم OpenAI بمحاكاة عبر Gateway، ويتحقق من أن `web_search` يرفع `reasoning.effort` من `minimal` إلى `low`، ثم يفرض رفض مخطط المزود ويفحص ظهور التفصيل الخام في سجلات Gateway. +- جسر قناة MCP (Gateway مزروع + جسر stdio + اختبار دخان لإطار إشعار خام من Claude): `pnpm test:docker:mcp-channels` (السكريبت: `scripts/e2e/mcp-channels-docker.sh`) +- أدوات MCP لحزمة Pi (خادم MCP حقيقي عبر stdio + اختبار دخان لسماح/منع ملف Pi المضمن): `pnpm test:docker:pi-bundle-mcp-tools` (السكريبت: `scripts/e2e/pi-bundle-mcp-tools-docker.sh`) +- تنظيف MCP لـ Cron/الوكيل الفرعي (Gateway حقيقي + إنهاء تابع MCP عبر stdio بعد تشغيلات cron معزولة ووكيل فرعي لمرة واحدة): `pnpm test:docker:cron-mcp-cleanup` (السكريبت: `scripts/e2e/cron-mcp-cleanup-docker.sh`) +- Plugins (اختبار دخان التثبيت، تثبيت/إزالة حزمة ClawHub الشاملة، تحديثات السوق، وتمكين/فحص حزمة Claude): `pnpm test:docker:plugins` (السكريبت: `scripts/e2e/plugins-docker.sh`) + عيّن `OPENCLAW_PLUGINS_E2E_CLAWHUB=0` لتخطي كتلة ClawHub، أو تجاوز زوج الحزمة/وقت التشغيل الشامل الافتراضيين عبر `OPENCLAW_PLUGINS_E2E_CLAWHUB_SPEC` و`OPENCLAW_PLUGINS_E2E_CLAWHUB_ID`. من دون `OPENCLAW_CLAWHUB_URL`/`CLAWHUB_URL`، يستخدم الاختبار خادم تجهيز ClawHub محليا محكما. +- اختبار دخان عدم تغير تحديث Plugin: `pnpm test:docker:plugin-update` (السكريبت: `scripts/e2e/plugin-update-unchanged-docker.sh`) +- اختبار دخان بيانات إعادة تحميل الإعداد الوصفية: `pnpm test:docker:config-reload` (السكريبت: `scripts/e2e/config-reload-source-docker.sh`) +- تبعيات وقت تشغيل Plugin المضمن: `pnpm test:docker:bundled-channel-deps` يبني صورة مشغل Docker صغيرة افتراضيا، ثم يبني ويحزم OpenClaw مرة واحدة على المضيف، ثم يركّب ذلك الأرشيف في كل سيناريو تثبيت Linux. أعد استخدام الصورة عبر `OPENCLAW_SKIP_DOCKER_BUILD=1`، أو تخط إعادة بناء المضيف بعد بناء محلي حديث عبر `OPENCLAW_BUNDLED_CHANNEL_HOST_BUILD=0`، أو أشر إلى أرشيف موجود عبر `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz`. يحزم تجميع Docker الكامل وقطع bundled-channel في مسار الإصدار هذا الأرشيف مسبقا مرة واحدة، ثم يجزئ فحوصات القنوات المضمنة إلى مسارات مستقلة، بما في ذلك مسارات تحديث منفصلة لـ Telegram وDiscord وSlack وFeishu وmemory-lancedb وACPX. تقسّم قطع الإصدار اختبارات دخان القنوات، وأهداف التحديث، وعقود الإعداد/وقت التشغيل إلى `bundled-channels-core` و`bundled-channels-update-a` و`bundled-channels-update-b` و`bundled-channels-contracts`؛ وتبقى قطعة التجميع `bundled-channels` متاحة للإعادات اليدوية. يقسّم مسار عمل الإصدار أيضا قطع مثبت المزود وقطع تثبيت/إزالة Plugin المضمن؛ وتبقى قطع `package-update` و`plugins-runtime` و`plugins-integrations` القديمة أسماء مستعارة تجميعية للإعادات اليدوية. استخدم `OPENCLAW_BUNDLED_CHANNELS=telegram,slack` لتضييق مصفوفة القنوات عند تشغيل المسار المضمن مباشرة، أو `OPENCLAW_BUNDLED_CHANNEL_UPDATE_TARGETS=telegram,acpx` لتضييق سيناريو التحديث. تعتمد تشغيلات Docker لكل سيناريو افتراضيا على `OPENCLAW_BUNDLED_CHANNEL_DOCKER_RUN_TIMEOUT=900s`؛ ويعتمد سيناريو التحديث متعدد الأهداف افتراضيا على `OPENCLAW_BUNDLED_CHANNEL_UPDATE_DOCKER_RUN_TIMEOUT=2400s`. يتحقق المسار أيضا من أن `channels..enabled=false` و`plugins.entries..enabled=false` يمنعان إصلاح doctor لتبعيات وقت التشغيل. +- ضيّق تبعيات وقت تشغيل Plugin المضمنة أثناء التكرار بتعطيل السيناريوهات غير ذات الصلة، مثلا: `OPENCLAW_BUNDLED_CHANNEL_SCENARIOS=0 OPENCLAW_BUNDLED_CHANNEL_UPDATE_SCENARIO=0 OPENCLAW_BUNDLED_CHANNEL_ROOT_OWNED_SCENARIO=0 OPENCLAW_BUNDLED_CHANNEL_SETUP_ENTRY_SCENARIO=0 pnpm test:docker:bundled-channel-deps`. لبناء الصورة الوظيفية المشتركة مسبقا وإعادة استخدامها يدويا: @@ -603,73 +604,112 @@ OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker: OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channels ``` -تبقى تجاوزات الصور الخاصة بالحزمة مثل `OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE` هي السائدة عند ضبطها. عندما يشير `OPENCLAW_SKIP_DOCKER_BUILD=1` إلى صورة مشتركة بعيدة، تسحبها السكريبتات إذا لم تكن محلية بالفعل. تحتفظ اختبارات Docker الخاصة بـ QR والمثبت بملفات Dockerfile الخاصة بها لأنها تتحقق من سلوك الحزمة/التثبيت بدلا من تشغيل التطبيق المبني المشترك. +تبقى تجاوزات الصور الخاصة بالمجموعة مثل `OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE` صاحبة الأولوية عند تعيينها. عندما يشير `OPENCLAW_SKIP_DOCKER_BUILD=1` إلى صورة مشتركة بعيدة، تسحبها السكريبتات إذا لم تكن محلية بالفعل. تحتفظ اختبارات QR ومثبت Docker بملفات Dockerfile الخاصة بها لأنها تتحقق من سلوك الحزمة/التثبيت بدلا من وقت تشغيل التطبيق المبني المشترك. -تثبت مشغلات Docker للنماذج المباشرة أيضا checkout الحالي للقراءة فقط وتهيئه في workdir مؤقت داخل الحاوية. يحافظ ذلك على خفة صورة التشغيل مع الاستمرار في تشغيل Vitest مقابل مصدرك/إعداداتك المحلية الدقيقة. تتخطى خطوة التهيئة ذاكرات التخزين المؤقت المحلية الكبيرة ومخرجات بناء التطبيقات مثل `.pnpm-store` و`.worktrees` و`__openclaw_vitest__` ومجلدات مخرجات `.build` المحلية للتطبيق أو Gradle، حتى لا تقضي تشغيلات Docker المباشرة دقائق في نسخ آثار خاصة بالجهاز. كما تضبط `OPENCLAW_SKIP_CHANNELS=1` حتى لا تبدأ تحقيقات Gateway المباشرة عمال قنوات Telegram/Discord/etc. حقيقيين داخل الحاوية. لا يزال `test:docker:live-models` يشغل `pnpm test:live`، لذا مرر أيضا `OPENCLAW_LIVE_GATEWAY_*` عندما تحتاج إلى تضييق أو استبعاد تغطية Gateway المباشرة من مسار Docker ذلك. `test:docker:openwebui` هو اختبار دخان توافق أعلى مستوى: يبدأ حاوية Gateway من OpenClaw مع تفعيل نقاط نهاية HTTP المتوافقة مع OpenAI، ويبدأ حاوية Open WebUI مثبتة بإصدار محدد مقابل ذلك Gateway، ويسجل الدخول عبر Open WebUI، ويتحقق من أن `/api/models` يعرض `openclaw/default`، ثم يرسل طلب محادثة حقيقيا عبر وكيل `/api/chat/completions` الخاص بـ Open WebUI. قد يكون التشغيل الأول أبطأ بشكل ملحوظ لأن Docker قد يحتاج إلى سحب صورة Open WebUI وقد يحتاج Open WebUI إلى إنهاء إعداد بدء التشغيل البارد الخاص به. يتوقع هذا المسار مفتاح نموذج مباشر قابل للاستخدام، و`OPENCLAW_PROFILE_FILE` (`~/.profile` افتراضيا) هو الطريقة الأساسية لتوفيره في تشغيلات Docker. تطبع التشغيلات الناجحة حمولة JSON صغيرة مثل `{ "ok": true, "model": "openclaw/default", ... }`. `test:docker:mcp-channels` حتمي عمدا ولا يحتاج إلى حساب Telegram أو Discord أو iMessage حقيقي. يشغل حاوية Gateway مزروعة، ويبدأ حاوية ثانية تنشئ `openclaw mcp serve`، ثم يتحقق من اكتشاف المحادثات الموجهة، وقراءات النصوص، وبيانات تعريف المرفقات، وسلوك قائمة انتظار الأحداث المباشرة، وتوجيه الإرسال الصادر، وإشعارات القناة + الأذونات على نمط Claude عبر جسر stdio MCP الحقيقي. يفحص تحقق الإشعارات إطارات stdio MCP الخام مباشرة حتى يتحقق اختبار الدخان مما يصدره الجسر فعليا، وليس فقط ما يحدث أن يعرضه SDK عميل محدد. `test:docker:pi-bundle-mcp-tools` حتمي ولا يحتاج إلى مفتاح نموذج مباشر. يبني صورة Docker للمستودع، ويبدأ خادم اختبار stdio MCP حقيقيا داخل الحاوية، ويجسد ذلك الخادم عبر تشغيل MCP لحزمة Pi المضمنة، وينفذ الأداة، ثم يتحقق من أن `coding` و`messaging` يحتفظان بأدوات `bundle-mcp` بينما يرشحها `minimal` و`tools.deny: ["bundle-mcp"]`. `test:docker:cron-mcp-cleanup` حتمي ولا يحتاج إلى مفتاح نموذج مباشر. يبدأ Gateway مزروعا مع خادم اختبار stdio MCP حقيقي، ويشغل دورة cron معزولة ودورة ابن `/subagents spawn` لمرة واحدة، ثم يتحقق من خروج عملية MCP الابنة بعد كل تشغيل. +تقوم مشغلات Docker للنماذج الحية أيضا بربط checkout الحالي للقراءة فقط و +تجهيزه في workdir مؤقت داخل الحاوية. يحافظ هذا على خفة صورة التشغيل +مع استمرار تشغيل Vitest على المصدر/الإعداد المحلي الدقيق لديك. +تتخطى خطوة التجهيز التخزينات المؤقتة المحلية الكبيرة ومخرجات بناء التطبيقات مثل +`.pnpm-store` و`.worktrees` و`__openclaw_vitest__` وأدلة مخرجات `.build` المحلية للتطبيق أو +Gradle حتى لا تستغرق تشغيلات Docker الحية دقائق في نسخ +آثار خاصة بالجهاز. +كما تضبط `OPENCLAW_SKIP_CHANNELS=1` حتى لا تبدأ فحوص Gateway الحية +عمّال قنوات Telegram/Discord/إلخ. الحقيقيين داخل الحاوية. +لا يزال `test:docker:live-models` يشغّل `pnpm test:live`، لذا مرّر أيضا +`OPENCLAW_LIVE_GATEWAY_*` عندما تحتاج إلى تضييق تغطية Gateway +الحية أو استبعادها من مسار Docker ذلك. +`test:docker:openwebui` هو فحص توافق دخاني أعلى مستوى: يبدأ +حاوية Gateway من OpenClaw مع تفعيل نقاط نهاية HTTP المتوافقة مع OpenAI، +ويبدأ حاوية Open WebUI مثبّتة مقابل ذلك Gateway، ويسجّل الدخول عبر +Open WebUI، ويتحقق من أن `/api/models` يعرض `openclaw/default`، ثم يرسل +طلب محادثة حقيقي عبر وكيل `/api/chat/completions` في Open WebUI. +قد تكون التشغيله الأولى أبطأ بشكل ملحوظ لأن Docker قد يحتاج إلى سحب صورة +Open WebUI وقد يحتاج Open WebUI إلى إنهاء إعداد بدء التشغيل البارد الخاص به. +يتوقع هذا المسار مفتاح نموذج حي قابل للاستخدام، و`OPENCLAW_PROFILE_FILE` +(`~/.profile` افتراضيا) هي الطريقة الأساسية لتوفيره في التشغيلات المعبأة في Docker. +تطبع التشغيلات الناجحة حمولة JSON صغيرة مثل `{ "ok": true, "model": +"openclaw/default", ... }`. +`test:docker:mcp-channels` حتمي عمدا ولا يحتاج إلى حساب +Telegram أو Discord أو iMessage حقيقي. يشغّل حاوية Gateway مبذورة، +ويبدأ حاوية ثانية تنشئ `openclaw mcp serve`، ثم يتحقق من +اكتشاف المحادثات الموجّهة، وقراءات النصوص، وبيانات مرفقات التعريف، +وسلوك صف الأحداث الحية، وتوجيه الإرسال الصادر، وإشعارات القناة + +الأذونات بأسلوب Claude عبر جسر stdio MCP الحقيقي. يفحص تحقق الإشعارات +إطارات stdio MCP الخام مباشرة حتى يتحقق الفحص الدخاني مما يصدره +الجسر فعليا، وليس فقط ما يحدث أن تعرضه SDK عميل محددة. +`test:docker:pi-bundle-mcp-tools` حتمي ولا يحتاج إلى مفتاح نموذج حي. +يبني صورة Docker للمستودع، ويبدأ خادم فحص stdio MCP حقيقيا +داخل الحاوية، ويجسّد ذلك الخادم عبر وقت تشغيل MCP الخاص بحزمة Pi المضمنة، +وينفذ الأداة، ثم يتحقق من أن `coding` و`messaging` يحتفظان +بأدوات `bundle-mcp` بينما تقوم `minimal` و`tools.deny: ["bundle-mcp"]` بترشيحها. +`test:docker:cron-mcp-cleanup` حتمي ولا يحتاج إلى مفتاح نموذج حي. +يبدأ Gateway مبذورا مع خادم فحص stdio MCP حقيقي، ويشغّل +دورة cron معزولة ودورة ابن لمرة واحدة عبر `/subagents spawn`، ثم يتحقق +من أن عملية MCP الابنة تخرج بعد كل تشغيل. -اختبار دخان سلسلة ACP يدوية بلغة عادية (ليس CI): +فحص دخاني يدوي لسلسلة ACP باللغة العادية (ليس CI): - `bun scripts/dev/discord-acp-plain-language-smoke.ts --channel ...` -- احتفظ بهذا السكربت لتدفقات عمل الانحدار/التصحيح. قد تكون هناك حاجة إليه مجددًا للتحقق من توجيه سلاسل ACP، لذلك لا تحذفه. +- أبق هذا السكربت لتدفقات عمل الانحدار/التصحيح. قد تكون هناك حاجة إليه مجددا للتحقق من توجيه سلاسل ACP، لذا لا تحذفه. -متغيرات البيئة المفيدة: +متغيرات بيئة مفيدة: -- `OPENCLAW_CONFIG_DIR=...` (الافتراضي: `~/.openclaw`) مركب على `/home/node/.openclaw` -- `OPENCLAW_WORKSPACE_DIR=...` (الافتراضي: `~/.openclaw/workspace`) مركب على `/home/node/.openclaw/workspace` -- `OPENCLAW_PROFILE_FILE=...` (الافتراضي: `~/.profile`) مركب على `/home/node/.profile` ويتم تحميله قبل تشغيل الاختبارات -- `OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1` للتحقق فقط من متغيرات البيئة المحملة من `OPENCLAW_PROFILE_FILE`، باستخدام مجلدات إعدادات/مساحة عمل مؤقتة ومن دون تركيبات مصادقة CLI خارجية -- `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...` (الافتراضي: `~/.cache/openclaw/docker-cli-tools`) مركب على `/home/node/.npm-global` لتثبيتات CLI المخزنة مؤقتًا داخل Docker -- تُركب مجلدات/ملفات مصادقة CLI الخارجية ضمن `$HOME` للقراءة فقط تحت `/host-auth...`، ثم تُنسخ إلى `/home/node/...` قبل بدء الاختبارات - - المجلدات الافتراضية: `.minimax` +- `OPENCLAW_CONFIG_DIR=...` (الافتراضي: `~/.openclaw`) مركّب إلى `/home/node/.openclaw` +- `OPENCLAW_WORKSPACE_DIR=...` (الافتراضي: `~/.openclaw/workspace`) مركّب إلى `/home/node/.openclaw/workspace` +- `OPENCLAW_PROFILE_FILE=...` (الافتراضي: `~/.profile`) مركّب إلى `/home/node/.profile` ويتم تحميله قبل تشغيل الاختبارات +- `OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1` للتحقق فقط من متغيرات البيئة المحملة من `OPENCLAW_PROFILE_FILE`، باستخدام أدلة إعداد/مساحة عمل مؤقتة ودون تركيبات مصادقة CLI خارجية +- `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...` (الافتراضي: `~/.cache/openclaw/docker-cli-tools`) مركّب إلى `/home/node/.npm-global` لتثبيتات CLI المخزنة مؤقتا داخل Docker +- يتم تركيب أدلة/ملفات مصادقة CLI الخارجية تحت `$HOME` للقراءة فقط تحت `/host-auth...`، ثم نسخها إلى `/home/node/...` قبل بدء الاختبارات + - الأدلة الافتراضية: `.minimax` - الملفات الافتراضية: `~/.codex/auth.json`، `~/.codex/config.toml`، `.claude.json`، `~/.claude/.credentials.json`، `~/.claude/settings.json`، `~/.claude/settings.local.json` - - تشغلات المزوّد المضيقة تركب فقط المجلدات/الملفات المطلوبة المستنتجة من `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` - - تجاوز ذلك يدويًا باستخدام `OPENCLAW_DOCKER_AUTH_DIRS=all` أو `OPENCLAW_DOCKER_AUTH_DIRS=none` أو قائمة مفصولة بفواصل مثل `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` + - تقوم تشغيلات المزوّدين المضيقة بتركيب الأدلة/الملفات المطلوبة فقط المستنتجة من `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` + - تجاوز ذلك يدويا باستخدام `OPENCLAW_DOCKER_AUTH_DIRS=all` أو `OPENCLAW_DOCKER_AUTH_DIRS=none` أو قائمة مفصولة بفواصل مثل `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` - `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` لتضييق التشغيل -- `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` لتصفية المزوّدين داخل الحاوية -- `OPENCLAW_SKIP_DOCKER_BUILD=1` لإعادة استخدام صورة `openclaw:local-live` موجودة لإعادات التشغيل التي لا تحتاج إلى إعادة بناء +- `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` لترشيح المزوّدين داخل الحاوية +- `OPENCLAW_SKIP_DOCKER_BUILD=1` لإعادة استخدام صورة `openclaw:local-live` موجودة للتشغيلات المعادة التي لا تحتاج إلى إعادة بناء - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` لضمان أن بيانات الاعتماد تأتي من مخزن الملف الشخصي (وليس من البيئة) -- `OPENCLAW_OPENWEBUI_MODEL=...` لاختيار النموذج الذي يعرضه Gateway لاختبار Open WebUI السريع -- `OPENCLAW_OPENWEBUI_PROMPT=...` لتجاوز مطالبة فحص nonce المستخدمة بواسطة اختبار Open WebUI السريع +- `OPENCLAW_OPENWEBUI_MODEL=...` لاختيار النموذج الذي يعرضه Gateway لفحص Open WebUI الدخاني +- `OPENCLAW_OPENWEBUI_PROMPT=...` لتجاوز مطالبة تحقق nonce المستخدمة بواسطة فحص Open WebUI الدخاني - `OPENWEBUI_IMAGE=...` لتجاوز وسم صورة Open WebUI المثبتة -## فحص سلامة المستندات +## سلامة المستندات -شغّل فحوصات المستندات بعد تعديلات المستندات: `pnpm check:docs`. -شغّل تحقق Mintlify الكامل من المراسي عندما تحتاج أيضًا إلى فحوصات عناوين داخل الصفحة: `pnpm docs:check-links:anchors`. +شغّل فحوص المستندات بعد تعديلات المستندات: `pnpm check:docs`. +شغّل تحقق روابط Mintlify الكامل عندما تحتاج أيضا إلى فحوص عناوين داخل الصفحة: `pnpm docs:check-links:anchors`. ## انحدار دون اتصال (آمن لـ CI) -هذه انحدارات "مسار تنفيذ حقيقي" من دون مزوّدين حقيقيين: +هذه انحدارات «مسار حقيقي» دون مزوّدين حقيقيين: -- استدعاء أدوات Gateway (OpenAI محاكى، Gateway حقيقي + حلقة وكيل): `src/gateway/gateway.test.ts` (الحالة: "runs a mock OpenAI tool call end-to-end via gateway agent loop") -- معالج Gateway (WS `wizard.start`/`wizard.next`، يكتب الإعدادات + يفرض المصادقة): `src/gateway/gateway.test.ts` (الحالة: "runs wizard over ws and writes auth token config") +- استدعاء أدوات Gateway (OpenAI وهمي، Gateway حقيقي + حلقة وكيل): `src/gateway/gateway.test.ts` (الحالة: "runs a mock OpenAI tool call end-to-end via gateway agent loop") +- معالج Gateway (WS `wizard.start`/`wizard.next`، يكتب الإعداد + يفرض المصادقة): `src/gateway/gateway.test.ts` (الحالة: "runs wizard over ws and writes auth token config") -## تقييمات موثوقية الوكيل (Skills) +## تقييمات موثوقية الوكيل (skills) -لدينا بالفعل بضعة اختبارات آمنة لـ CI تتصرف مثل "تقييمات موثوقية الوكيل": +لدينا بالفعل بضعة اختبارات آمنة لـ CI تتصرف مثل «تقييمات موثوقية الوكيل»: -- استدعاء أدوات محاكى عبر Gateway الحقيقي + حلقة الوكيل (`src/gateway/gateway.test.ts`). -- تدفقات معالج كاملة تتحقق من توصيل الجلسة وتأثيرات الإعدادات (`src/gateway/gateway.test.ts`). +- استدعاء أدوات وهمي عبر Gateway الحقيقي + حلقة الوكيل (`src/gateway/gateway.test.ts`). +- تدفقات معالج من طرف إلى طرف تتحقق من توصيل الجلسة وآثار الإعداد (`src/gateway/gateway.test.ts`). -ما لا يزال مفقودًا لـ Skills (راجع [Skills](/ar/tools/skills)): +ما لا يزال مفقودا لـ skills (انظر [Skills](/ar/tools/skills)): -- **اتخاذ القرار:** عندما تُدرج Skills في المطالبة، هل يختار الوكيل Skill الصحيحة (أو يتجنب غير ذات الصلة)؟ +- **اتخاذ القرار:** عندما تُدرج skills في المطالبة، هل يختار الوكيل skill الصحيحة (أو يتجنب غير ذات الصلة)؟ - **الامتثال:** هل يقرأ الوكيل `SKILL.md` قبل الاستخدام ويتبع الخطوات/الوسائط المطلوبة؟ -- **عقود سير العمل:** سيناريوهات متعددة الأدوار تتحقق من ترتيب الأدوات، واستمرارية سجل الجلسة، وحدود sandbox. +- **عقود سير العمل:** سيناريوهات متعددة الأدوار تؤكد ترتيب الأدوات، وحمل تاريخ الجلسة، وحدود sandbox. -يجب أن تبقى التقييمات المستقبلية حتمية أولًا: +ينبغي أن تبقى التقييمات المستقبلية حتمية أولا: -- مشغّل سيناريوهات يستخدم مزوّدين محاكين للتحقق من استدعاءات الأدوات + ترتيبها، وقراءات ملفات Skill، وتوصيل الجلسة. -- مجموعة صغيرة من السيناريوهات المركزة على Skills (الاستخدام مقابل التجنب، البوابات، حقن المطالبات). -- تقييمات حية اختيارية (بالاشتراك، ومحكومة بمتغيرات البيئة) فقط بعد توفر المجموعة الآمنة لـ CI. +- مشغّل سيناريو يستخدم مزوّدين وهميين لتأكيد استدعاءات الأدوات + ترتيبها، وقراءات ملف skill، وتوصيل الجلسة. +- مجموعة صغيرة من السيناريوهات المركّزة على skill (استخدام مقابل تجنب، بوابات، حقن المطالبة). +- تقييمات حية اختيارية (باشتراك صريح، ومقيّدة بالبيئة) فقط بعد وجود المجموعة الآمنة لـ CI. ## اختبارات العقود (شكل Plugin والقناة) -تتحقق اختبارات العقود من أن كل Plugin وقناة مسجلين يلتزمان بعقد -الواجهة الخاص بهما. وهي تمر على كل Plugins المكتشفة وتشغل مجموعة من -توكيدات الشكل والسلوك. مسار وحدات `pnpm test` الافتراضي يتخطى عمدًا -ملفات وصلات المشاركة والاختبارات السريعة هذه؛ شغّل أوامر العقود صراحة -عندما تمس أسطح القنوات أو المزوّدين المشتركة. +تتحقق اختبارات العقود من أن كل Plugin وقناة مسجلين يلتزمان +بعقد الواجهة الخاص بهما. تمر على كل plugins المكتشفة وتشغّل مجموعة من +تأكيدات الشكل والسلوك. يتخطى مسار وحدات `pnpm test` الافتراضي عمدا +ملفات الفحص الدخاني والـ seam المشتركة هذه؛ شغّل أوامر العقود صراحة +عندما تلمس أسطح القنوات أو المزوّدين المشتركة. ### الأوامر @@ -681,22 +721,22 @@ OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOC موجودة في `src/channels/plugins/contracts/*.contract.test.ts`: -- **plugin** - الشكل الأساسي لـ Plugin (المعرّف، الاسم، الإمكانات) +- **plugin** - شكل Plugin الأساسي (id، name، capabilities) - **setup** - عقد معالج الإعداد - **session-binding** - سلوك ربط الجلسة - **outbound-payload** - بنية حمولة الرسالة - **inbound** - معالجة الرسائل الواردة - **actions** - معالجات إجراءات القناة -- **threading** - معالجة معرّف السلسلة -- **directory** - واجهة برمجة تطبيقات الدليل/القائمة +- **threading** - التعامل مع معرف السلسلة +- **directory** - واجهة API للدليل/القائمة - **group-policy** - فرض سياسة المجموعة -### عقود حالة المزوّدين +### عقود حالة المزوّد موجودة في `src/plugins/contracts/*.contract.test.ts`. -- **status** - فحوصات حالة القناة -- **registry** - شكل سجل Plugins +- **status** - فحوص حالة القناة +- **registry** - شكل سجل Plugin ### عقود المزوّدين @@ -704,35 +744,35 @@ OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOC - **auth** - عقد تدفق المصادقة - **auth-choice** - اختيار/تحديد المصادقة -- **catalog** - واجهة برمجة تطبيقات كتالوج النماذج -- **discovery** - اكتشاف Plugins +- **catalog** - API كتالوج النماذج +- **discovery** - اكتشاف Plugin - **loader** - تحميل Plugin - **runtime** - وقت تشغيل المزوّد - **shape** - شكل/واجهة Plugin - **wizard** - معالج الإعداد -### متى تشغلها +### متى تشغّلها - بعد تغيير صادرات plugin-sdk أو المسارات الفرعية - بعد إضافة أو تعديل قناة أو Plugin مزوّد -- بعد إعادة هيكلة تسجيل Plugins أو اكتشافها +- بعد إعادة هيكلة تسجيل Plugin أو اكتشافه تعمل اختبارات العقود في CI ولا تتطلب مفاتيح API حقيقية. -## إضافة الانحدارات (إرشادات) +## إضافة انحدارات (إرشادات) -عندما تصلح مشكلة مزوّد/نموذج اكتُشفت في التشغيل الحي: +عندما تصلح مشكلة مزوّد/نموذج مكتشفة في الوضع الحي: -- أضف انحدارًا آمنًا لـ CI إن أمكن (مزوّد محاكى/بديل، أو التقط تحويل شكل الطلب الدقيق) -- إذا كان الأمر حيًا بطبيعته فقط (حدود المعدل، سياسات المصادقة)، فأبق الاختبار الحي ضيقًا واختياريًا عبر متغيرات البيئة -- فضّل استهداف أصغر طبقة تلتقط الخطأ: - - خطأ تحويل/إعادة تشغيل طلب المزوّد → اختبار نماذج مباشر - - خطأ مسار جلسة/سجل/أدوات Gateway → اختبار سريع حي لـ Gateway أو اختبار Gateway محاكى آمن لـ CI -- حاجز حماية عبور SecretRef: - - يشتق `src/secrets/exec-secret-ref-id-parity.test.ts` هدفًا واحدًا مأخوذًا كعينة لكل فئة SecretRef من بيانات سجل البيانات الوصفية (`listSecretTargetRegistryEntries()`)، ثم يؤكد رفض معرّفات exec ذات مقاطع العبور. - - إذا أضفت عائلة أهداف SecretRef جديدة مع `includeInPlan` في `src/secrets/target-registry-data.ts`، فحدّث `classifyTargetClass` في ذلك الاختبار. يفشل الاختبار عمدًا عند معرّفات الأهداف غير المصنفة حتى لا يمكن تخطي الفئات الجديدة بصمت. +- أضف انحدارا آمنا لـ CI إن أمكن (مزوّد mock/stub، أو التقط تحويل شكل الطلب الدقيق) +- إذا كانت بطبيعتها حية فقط (حدود المعدل، سياسات المصادقة)، فأبق الاختبار الحي ضيقا واختياريا عبر متغيرات البيئة +- فضّل استهداف أصغر طبقة تلتقط الخلل: + - خلل تحويل/إعادة تشغيل طلب المزوّد → اختبار نماذج مباشر + - خلل في مسار جلسة/تاريخ/أدوات Gateway → فحص Gateway حي دخاني أو اختبار Gateway وهمي آمن لـ CI +- حاجز اجتياز SecretRef: + - يستنتج `src/secrets/exec-secret-ref-id-parity.test.ts` هدفا عيّنيا واحدا لكل فئة SecretRef من بيانات تعريف السجل (`listSecretTargetRegistryEntries()`)، ثم يؤكد رفض معرفات exec ذات مقاطع الاجتياز. + - إذا أضفت عائلة أهداف SecretRef جديدة ذات `includeInPlan` في `src/secrets/target-registry-data.ts`، فحدّث `classifyTargetClass` في ذلك الاختبار. يفشل الاختبار عمدا عند معرفات أهداف غير مصنفة حتى لا يمكن تخطي الفئات الجديدة بصمت. -## ذات صلة +## ذو صلة -- [الاختبار الحي](/ar/help/testing-live) +- [اختبار حي](/ar/help/testing-live) - [CI](/ar/ci) diff --git a/docs/ar/reference/test.md b/docs/ar/reference/test.md index 26d5d01c2..91dc9094a 100644 --- a/docs/ar/reference/test.md +++ b/docs/ar/reference/test.md @@ -1,58 +1,59 @@ --- read_when: - تشغيل الاختبارات أو إصلاحها -summary: كيفية تشغيل الاختبارات محليًا (vitest) ومتى تستخدم وضعَي force/coverage +summary: كيفية تشغيل الاختبارات محليًا (vitest) ومتى تستخدم أوضاع force/coverage title: الاختبارات x-i18n: - generated_at: "2026-04-30T08:25:10Z" + generated_at: "2026-04-30T18:38:38Z" model: gpt-5.5 provider: openai - source_hash: 9328d6f0383b5067fa8bb5d0f1bf22a3b9048a267908bf85167842ddc3d12e42 + source_hash: 131f2bad3b2806d28394213cec38d632d106ddbf8ff04d06345ab8046fb8bcf2 source_path: reference/test.md workflow: 16 --- -- حزمة الاختبار الكاملة (مجموعات الاختبار، الاختبار المباشر، Docker): [الاختبار](/ar/help/testing) +- مجموعة الاختبار الكاملة (مجموعات الاختبار، المباشر، Docker): [الاختبار](/ar/help/testing) -- `pnpm test:force`: يقتل أي عملية Gateway عالقة تمسك بمنفذ التحكم الافتراضي، ثم يشغل مجموعة Vitest الكاملة باستخدام منفذ Gateway معزول حتى لا تتصادم اختبارات الخادم مع نسخة قيد التشغيل. استخدم هذا عندما تترك عملية Gateway سابقة المنفذ 18789 مشغولًا. -- `pnpm test:coverage`: يشغل مجموعة اختبارات الوحدة مع تغطية V8 (عبر `vitest.unit.config.ts`). هذا بوابة تغطية وحدة للملفات المحملة، وليس تغطية لكل ملفات المستودع بالكامل. العتبات هي 70% للأسطر/الدوال/العبارات و55% للفروع. لأن `coverage.all` قيمته false، تقيس البوابة الملفات التي حملتها مجموعة تغطية الوحدة بدلًا من معاملة كل ملف مصدر في المسارات المقسمة كغير مغطى. -- `pnpm test:coverage:changed`: يشغل تغطية الوحدة فقط للملفات التي تغيرت منذ `origin/main`. -- `pnpm test:changed`: تشغيل اختبار ذكي ورخيص للتغييرات. يشغل الأهداف الدقيقة من تعديلات الاختبارات المباشرة، وملفات `*.test.ts` الشقيقة، وخرائط المصدر الصريحة، ومخطط الاستيراد المحلي. يتم تخطي تغييرات النطاق الواسع/الإعدادات/الحزم ما لم تُطابق اختبارات دقيقة. -- `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`: تشغيل اختبار تغييرات واسع وصريح. استخدمه عندما ينبغي لتعديل في عدة الاختبار/الإعدادات/الحزمة أن يعود إلى سلوك Vitest الأوسع لاختبارات التغييرات. -- `pnpm changed:lanes`: يعرض المسارات المعمارية التي يفعّلها الفرق مقابل `origin/main`. -- `pnpm check:changed`: يشغل بوابة الفحص الذكية للتغييرات للفرق مقابل `origin/main`. يشغل أوامر فحص الأنواع، والlint، والحراسة للمسارات المعمارية المتأثرة، لكنه لا يشغل اختبارات Vitest. استخدم `pnpm test:changed` أو `pnpm test ` الصريح لإثبات الاختبار. -- `pnpm test`: يمرر أهداف الملفات/الأدلة الصريحة عبر مسارات Vitest محددة النطاق. تستخدم التشغيلات غير المستهدفة مجموعات شظايا ثابتة وتتوسع إلى إعدادات طرفية للتنفيذ المحلي المتوازي؛ وتتوسع مجموعة الإضافات دائمًا إلى إعدادات الشظايا لكل إضافة بدل عملية مشروع جذر واحدة ضخمة. -- تنتهي تشغيلات مغلف الاختبارات بملخص قصير `[test] passed|failed|skipped ... in ...`. يبقى سطر مدة Vitest نفسه هو تفصيل كل شظية. -- حالة اختبار OpenClaw المشتركة: استخدم `src/test-utils/openclaw-test-state.ts` من Vitest عندما يحتاج الاختبار إلى `HOME` معزول، أو `OPENCLAW_STATE_DIR`، أو `OPENCLAW_CONFIG_PATH`، أو مثبت إعدادات، أو مساحة عمل، أو دليل وكيل، أو مخزن ملفات تعريف المصادقة. -- مساعدات E2E للعمليات: استخدم `test/helpers/openclaw-test-instance.ts` عندما يحتاج اختبار E2E على مستوى عملية Vitest إلى Gateway قيد التشغيل، وبيئة CLI، والتقاط سجلات، وتنظيف في مكان واحد. -- مساعدات Docker/Bash E2E: يمكن للمسارات التي تستورد `scripts/lib/docker-e2e-image.sh` تمرير `docker_e2e_test_state_shell_b64