Release and CI
الاختبارات
- حزمة الاختبار الكاملة (مجموعات الاختبارات، الاختبارات الحية، Docker): الاختبار
- التحقق من التحديثات وحزم Plugin: اختبار التحديثات وPlugins
الإعداد الافتراضي للوكيل
تشغّل جلسات الوكيل الاختبارات وعمليات التحقق كثيفة الحوسبة عن بُعد عبر Crabbox. تستخدم شيفرة المشرفين الموثوقين Blacksmith Testbox افتراضيًا. يقوم سير عمل Testbox المُعدّ بتحميل بيانات الاعتماد، لذلك يجب أن تستخدم شيفرة المساهمين غير الموثوقين أو التفرعات CI للتفرعات بلا أسرار، أو AWS Crabbox المباشر والمُنقّى بدلًا منه.
عندما يُرجّح أن تتطلب مهمة شيفرة موثوقة اختبارات أو إثباتًا مكثفًا، ابدأ الإحماء
المسبق فورًا في جلسة أوامر تعمل في الخلفية، وواصل العمل أثناء تجهيزها،
وأعِد استخدام المعرّف tbx_... المُعاد، وزامن نسخة العمل الحالية في كل تشغيل،
وأوقفها قبل التسليم:
node scripts/crabbox-wrapper.mjs warmup --provider blacksmith-testbox --keep --timing-jsonبعد أول إعادة استخدام ناجحة، يسجّل الغلاف بصمة أساس الحجز
والاعتماديات وسير عمل Testbox ضمن .crabbox/testbox-leases/.
تستمر التعديلات التي تقتصر على المصدر في إعادة استخدام الصندوق المُسخّن. يؤدي تغيّر أساس الدمج أو ملف القفل
أو مدخل مدير الحزم أو الغلاف أو سير عمل Testbox إلى الإخفاق الآمن، ويتطلب
حجزًا جديدًا. وتستمر كل عملية تشغيل في مزامنة نسخة العمل الحالية.
يُخصّص OPENCLAW_TESTBOX_ALLOW_STALE=1 للتشخيص المتعمّد فقط، وليس
لإثبات الإصدار.
أوامر الاختبار المحلية أدناه مخصّصة لسير عمل البشر أو لحالة احتياطية صريحة للوكيل يطلبها المستخدم. يجب الإبلاغ عن عدم توفر المزوّد البعيد؛ فهذا لا يمنح إذنًا لتشغيل بوابة تحقق محلية واسعة بصمت.
بالنسبة إلى الشيفرة غير الموثوقة، نفّذ الإحماء المسبق باستخدام --provider aws. يجب أن تضبط كل عملية تشغيل
CRABBOX_ENV_ALLOW=CI، وتمرّر --provider aws --no-hydrate، وتستخدم
مجلد HOME بعيدًا مؤقتًا وجديدًا قبل تثبيت الاعتماديات أو تشغيل
الاختبارات. استخدم حجزًا جديدًا مُسخّنًا ومخصّصًا لذلك المصدر غير الموثوق؛ ولا تُعِد أبدًا استخدام
حجز موثوق أو جرى تحميل بيانات الاعتماد فيه سابقًا. شغّل ملف Crabbox التنفيذي الموثوق والمثبّت
من نسخة main موثوقة ونظيفة، واجلب طلب السحب البعيد فقط باستخدام
--fresh-pr؛ ولا تنفّذ أبدًا غلاف نسخة العمل غير الموثوقة أو إعداداتها محليًا.
ألغِ ضبط CRABBOX_AWS_INSTANCE_PROFILE، وأخفق بأمان ما لم تكن قيمة
aws.instanceProfile المحلولة فارغة. قبل أي تثبيت أو اختبار، استخدم
أدوات موثوقة ذات مسارات مطلقة لفرض رمز IMDSv2، وإثبات أن نقطة نهاية بيانات اعتماد IAM
تعيد 404، والتحقق من أن git rev-parse HEAD البعيد يساوي قيمة SHA الكاملة
لرأس طلب السحب الذي تمت مراجعته. اربط الحجز بقيمة SHA هذه وأوقفه وأعد إحماءه عند تغيّر الرأس.
ارفع scripts/crabbox-untrusted-bootstrap.sh الموثوق من نسخة
main نظيفة إلى جانب --fresh-pr؛ فهو يثبّت إصدارات Node وpnpm المثبّتة،
ويتحقق من SHA وتثبيت إصدار مدير الحزم، ويعزل HOME، ويثبّت الاعتماديات،
ثم ينفّذ الاختبار المطلوب. إذا تعذّر على الوسيط إثبات عدم وجود دور أو عدم وجود طلب سحب بعيد،
فاستخدم CI للتفرعات بلا أسرار. لا تستخدم hydrate-github أو --no-sync أو
سير عمل Testbox محمّلًا ببيانات الاعتماد.
ألغِ ضبط جميع تجاوزات CRABBOX_TAILSCALE*، وافرض --network public --tailscale=false، وامسح أعلام عقدة الخروج/الشبكة المحلية، واشترط أن يفيد crabbox inspect
بوجود شبكة عامة من دون حالة Tailscale قبل رفع أي برنامج نصي.
الترتيب المحلي المعتاد
pnpm test:changedلإثبات Vitest ضمن نطاق التغييرات.pnpm test <path-or-filter>لملف واحد أو دليل أو هدف صريح.pnpm testفقط عندما تحتاج عمدًا إلى مجموعة Vitest المحلية الكاملة.
في شجرة عمل Codex أو نسخة عمل مرتبطة/متناثرة، يتجنب الوكلاء التشغيل المحلي المباشر
لأوامر pnpm test* / pnpm check* / pnpm crabbox:run:
- حالة احتياطية محلية لملف صغير يطلبها المستخدم صراحةً:
node scripts/run-vitest.mjs <path-or-filter>. - بوابات التغييرات أو الإثبات الواسع:
node scripts/crabbox-wrapper.mjs run --provider blacksmith-testbox ... -- env OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 corepack pnpm check:changedلكي يعمل pnpm داخل Testbox. - تمثل قيمة
exitCodeالنهائية للغلاف وبيانات التوقيت بصيغة JSON نتيجة الأمر. قد تظهر عملية Blacksmith GitHub Actions المفوّضة بالحالةcancelledبعد نجاح أمر SSH لأن Testbox يُوقَف من خارج إجراء إبقاء الاتصال؛ تحقّق من ملخص الغلاف ومخرجات الأمر قبل اعتبار ذلك إخفاقًا. OPENCLAW_HEAVY_CHECK_LOCK_SCOPE=worktree <local-heavy-check command>: يُبقي تسلسل عمليات التحقق الثقيلة داخل شجرة العمل الحالية بدلًا من دليل Git المشترك لأوامر مثلpnpm check:changedوpnpm test ...المستهدف. استخدمه فقط على المضيفات المحلية عالية السعة عندما تشغّل عمدًا عمليات تحقق مستقلة عبر أشجار عمل مرتبطة.
الأوامر الأساسية
تنتهي عمليات تشغيل غلاف الاختبار بملخص قصير [test] passed|failed|skipped ... in ...؛ ويظل سطر المدة الخاص بـ Vitest هو تفاصيل كل شظية.
| الأمر | وظيفته |
|---|---|
pnpm test |
تُوجَّه أهداف الملفات/الأدلة الصريحة عبر مسارات Vitest محددة النطاق. أما عمليات التشغيل بلا أهداف فهي إثبات للمجموعة الكاملة: تتوسع مجموعات الشظايا الثابتة إلى إعدادات فرعية للتنفيذ المحلي المتوازي، مع طباعة التوزيع المتوقع للشظايا قبل البدء. وتتوسع مجموعة الامتدادات دائمًا إلى إعدادات شظايا لكل امتداد بدلًا من عملية ضخمة واحدة للمشروع الجذري. |
pnpm test:changed |
تشغيل ذكي ورخيص لاختبارات التغييرات: أهداف دقيقة من التعديلات المباشرة على الاختبارات، وملفات *.test.ts الشقيقة، وتعيينات المصدر الصريحة، ومخطط الاستيراد المحلي. تُتخطى تغييرات النطاق الواسع/الإعدادات/الحزم ما لم تُعيَّن إلى اختبارات دقيقة. |
OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed |
تشغيل واسع وصريح لاختبارات التغييرات؛ استخدمه عندما ينبغي أن يعود تعديل في بيئة الاختبار/الإعدادات/الحزمة إلى سلوك Vitest الأوسع لاختبارات التغييرات. |
pnpm test:force |
يحرّر منفذ Gateway المُعدّ في OpenClaw (الافتراضي 18789)، ثم يشغّل المجموعة الكاملة باستخدام منفذ Gateway معزول كي لا تتعارض اختبارات الخادم مع نسخة قيد التشغيل. |
pnpm test:coverage |
يُصدر تقريرًا معلوماتيًا عن تغطية V8 لمسار الوحدات الافتراضي (vitest.unit.config.ts)؛ ولا تُفرض أي حدود دنيا للتغطية. |
pnpm test:coverage:changed |
تغطية الوحدات فقط للملفات التي تغيّرت منذ origin/main. |
pnpm changed:lanes |
يعرض المسارات المعمارية التي يشغّلها الفرق مقارنةً بـ origin/main. |
pnpm check:changed |
يفوّض إلى Crabbox/Testbox افتراضيًا خارج CI، ثم يشغّل بوابة التحقق الذكية للتغييرات داخل العملية الفرعية البعيدة: التنسيق، إضافةً إلى فحص الأنواع والفحص الساكن وأوامر الحماية للمسارات المتأثرة. لا يشغّل Vitest؛ استخدم pnpm test:changed أو pnpm test <target> لإثبات الاختبار. |
حالة الاختبار المشتركة ومساعدات العمليات
src/test-utils/openclaw-test-state.ts: استخدمه من Vitest عندما يحتاج الاختبار إلىHOMEأوOPENCLAW_STATE_DIRأوOPENCLAW_CONFIG_PATHأو نموذج إعدادات أو مساحة عمل أو دليل وكيل أو مخزن ملفات تعريف المصادقة، على نحو معزول.pnpm test:env-mutations:report: تقرير غير حاجب للاختبارات/بيئات الاختبار التي تعدّلHOMEأوOPENCLAW_STATE_DIRأوOPENCLAW_CONFIG_PATHأوOPENCLAW_WORKSPACE_DIRأو مفاتيح البيئة المرتبطة بها مباشرةً. استخدمه للعثور على المرشحين للترحيل إلى مساعد حالة الاختبار المشتركة.test/helpers/openclaw-test-instance.ts: لاختبارات E2E على مستوى العملية التي تحتاج إلى Gateway قيد التشغيل وبيئة CLI والتقاط السجلات والتنظيف في مكان واحد.- يمكن لمسارات Docker/Bash الخاصة باختبارات E2E التي تستورد
scripts/lib/docker-e2e-image.shتمريرdocker_e2e_test_state_shell_b64 <label> <scenario>إلى الحاوية وفك ترميزه باستخدامscripts/lib/openclaw-e2e-instance.sh؛ ويمكن للبرامج النصية متعددة الأدلة الرئيسية تمريرdocker_e2e_test_state_function_b64واستدعاءopenclaw_test_state_create <label> <scenario>في كل تدفق. يكتبnode scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --jsonملف بيئة للمضيف يمكن استيراده (تحافظ--قبلcreateعلى عدم تعامل إصدارات Node الأحدث مع--env-fileعلى أنه علم Node). يمكن للمسارات التي تشغّل Gateway استيرادscripts/lib/openclaw-e2e-instance.shلحل نقطة الدخول، وبدء OpenAI الوهمي، والتشغيل في المقدمة/الخلفية، وفحوص الجاهزية، وتصدير بيئة الحالة، وتفريغ السجلات، وتنظيف العمليات.
مسارات واجهة التحكم وTUI والامتدادات
- اختبارات E2E لواجهة التحكم باستخدام محاكاة: يشغّل
pnpm test:ui:e2eمسار Vitest + Playwright الذي يبدأ واجهة تحكم Vite ويتحكم في صفحة Chromium حقيقية مقابل WebSocket محاكى لـ Gateway. توجد الاختبارات فيui/src/**/*.e2e.test.ts، وتوجد عناصر المحاكاة/التحكم المشتركة فيui/src/test-helpers/control-ui-e2e.ts. يتضمنpnpm test:e2eهذا المسار. تستخدم عمليات تشغيل الوكيل Testbox/Crabbox افتراضيًا، بما في ذلك الإثبات المستهدف؛ استخدمnode scripts/run-vitest.mjs run --config test/vitest/vitest.ui-e2e.config.ts --configLoader runner ui/src/ui/e2e/chat-flow.e2e.test.tsفقط كخيار احتياطي محلي صريح. - اختبارات TUI PTY: يشغّل
node scripts/run-vitest.mjs run --config test/vitest/vitest.tui-pty.config.tsمسار PTY السريع ذي الواجهة الخلفية الوهمية. يشغّلOPENCLAW_TUI_PTY_INCLUDE_LOCAL=1أوpnpm tui:pty:test:watch --mode localاختبار الدخان الأبطأ لـtui --local، والذي يحاكي نقطة نهاية النموذج الخارجية فقط. تحقّق من نص مرئي ثابت أو استدعاءات التجهيزات، وليس من لقطات ANSI الأولية. - يشغّل
pnpm test:extensionsوpnpm test extensionsجميع أجزاء الامتدادات/الإضافات. تعمل Plugins القنوات الثقيلة وPlugin المتصفح وOpenAI كأجزاء مخصصة؛ وتبقى مجموعات Plugins الأخرى مجمّعة. يشغّلpnpm test extensions/<id>مسار Plugin مضمّنة واحدة. - تُربط ملفات المصدر التي لها اختبارات شقيقة بذلك الاختبار الشقيق قبل الرجوع إلى أنماط glob أوسع للدليل. تستخدم تعديلات الأدوات المساعدة ضمن
src/channels/plugins/contracts/test-helpersوsrc/plugin-sdk/test-helpersوsrc/plugins/contractsرسمًا بيانيًا محليًا للاستيراد لتشغيل الاختبارات التي تستوردها بدلًا من تشغيل كل جزء على نطاق واسع عندما يكون مسار التبعية دقيقًا. - تتفرع أهداف أدلة العقود إلى مسارات العقود الخاصة بها: يشغّل
pnpm test src/channels/plugins/contractsإعدادات عقود القنوات الأربعة، ويشغّلpnpm test src/plugins/contractsإعداد عقود Plugins، لأن مشروعيchannels/pluginsالعامين يستبعدانcontracts/**. - ينقسم
auto-replyإلى ثلاثة إعدادات مخصصة (coreوtop-levelوreply) كي لا تهيمن أداة اختبار الردود على اختبارات الحالة/الرموز المميزة/الأدوات المساعدة الأخف في المستوى الأعلى. - تُوجَّه ملفات اختبار محددة في
plugin-sdkوcommandsعبر مسارات خفيفة مخصصة لا تُبقي سوىtest/setup.ts، مع إبقاء الحالات كثيفة التشغيل في مساراتها الحالية. - يستخدم إعداد Vitest الأساسي افتراضيًا
pool: "threads"وisolate: false، مع تمكين مشغّل الاختبارات المشترك غير المعزول عبر إعدادات المستودع. - يشغّل
pnpm test:channelsالملفvitest.channels.config.ts.
Gateway واختبارات E2E
- تكامل Gateway اختياري:
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm testأوpnpm test:gateway. pnpm test:e2e: تجميع اختبارات E2E للمستودع =pnpm test:e2e:gateway && pnpm test:ui:e2e.pnpm test:e2e:gateway: اختبارات دخان شاملة لـ Gateway (إقران WS/HTTP/Node متعدد النُسخ). تستخدم افتراضيًاthreadsمعisolate: falseوعمّالًا متكيفين فيvitest.e2e.config.ts؛ اضبطها باستخدامOPENCLAW_E2E_WORKERS=<n>، وفعّل السجلات التفصيلية باستخدامOPENCLAW_E2E_VERBOSE=1.pnpm test:live: اختبارات مباشرة لموفري الخدمة (Claude/Minimax/DeepSeek/z.ai/إلخ، مقيّدة بالنمط*.live.test.ts). تتطلب مفاتيح API وLIVE=1(أوOPENCLAW_LIVE_TEST=1) لإلغاء التخطي؛ ويمكن تفعيل المخرجات التفصيلية باستخدامOPENCLAW_LIVE_TEST_QUIET=0.
حزمة Docker الكاملة (pnpm test:docker:all)
تبني صورة الاختبارات المباشرة المشتركة، وتحزم OpenClaw مرة واحدة في أرشيف npm، وتبني/تعيد استخدام صورة تشغيل أساسية تتضمن Node/Git وصورة وظيفية تثبّت ذلك الأرشيف في /app، ثم تشغّل مسارات اختبارات الدخان في Docker من خلال مجدول موزون. يمثّل scripts/package-openclaw-for-docker.mjs أداة التحزيم الوحيدة المحلية/الخاصة بالتكامل المستمر، ويتحقق من الأرشيف ومن dist/postinstall-inventory.json قبل أن يستخدمه Docker.
- الصورة الأساسية (
OPENCLAW_DOCKER_E2E_BARE_IMAGE): مسارات المثبّت/التحديث/تبعيات Plugins؛ تُركّب الأرشيف المبني مسبقًا بدلًا من نسخ مصادر المستودع. - الصورة الوظيفية (
OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE): مسارات وظائف التطبيق المبني العادية. - تعريفات المسارات:
scripts/lib/docker-e2e-scenarios.mjs. المخطط:scripts/lib/docker-e2e-plan.mjs. المنفّذ:scripts/test-docker-all.mjs. - يُخرج
node scripts/test-docker-all.mjs --plan-jsonخطة التكامل المستمر التي يملكها المجدول (المسارات، وأنواع الصور، واحتياجات الحزمة/الصورة المباشرة، وسيناريوهات الحالة، وعمليات التحقق من بيانات الاعتماد) دون بناء Docker أو تشغيله.
عناصر التحكم في الجدولة (متغيرات البيئة، والقيم الافتراضية بين قوسين):
| متغير البيئة | القيمة الافتراضية | الغرض |
|---|---|---|
OPENCLAW_DOCKER_ALL_PARALLELISM |
10 | خانات العمليات. |
OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM |
10 | تجمّع المسارات اللاحقة الحساسة لموفري الخدمة. |
OPENCLAW_DOCKER_ALL_LIVE_LIMIT |
9 | الحد الأقصى لمسارات موفري الخدمة المباشرة الثقيلة. |
OPENCLAW_DOCKER_ALL_NPM_LIMIT |
5 | الحد الأقصى لمسارات موارد npm. |
OPENCLAW_DOCKER_ALL_SERVICE_LIMIT |
7 | الحد الأقصى لمسارات موارد الخدمات. |
OPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT / _CODEX_LIMIT / _GEMINI_LIMIT / _DROID_LIMIT / _OPENCODE_LIMIT |
4 | الحدود القصوى للمسارات الثقيلة لكل موفر خدمة. |
OPENCLAW_DOCKER_ALL_LIVE_OPENAI_LIMIT / _TELEGRAM_LIMIT |
1 | حدود قصوى أضيق لكل موفر خدمة. |
OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT / OPENCLAW_DOCKER_ALL_DOCKER_LIMIT |
- | تجاوز الإعداد للمضيفين الأكبر. |
OPENCLAW_DOCKER_ALL_START_STAGGER_MS |
2000 | التأخير بين بدء المسارات، لتجنب عواصف إنشاء العمليات في برنامج Docker الخفي المحلي. |
OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS |
7,200,000 (120 دقيقة) | مهلة احتياطية لكل مسار؛ تستخدم المسارات المباشرة/اللاحقة المحددة حدودًا أكثر صرامة. |
OPENCLAW_DOCKER_ALL_LIVE_RETRIES |
1 | عدد إعادة المحاولات لإخفاقات موفري الخدمة المباشرة العابرة. |
OPENCLAW_DOCKER_ALL_DRY_RUN |
متوقف | طباعة بيان المسارات دون تشغيل Docker. |
OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS |
30000 | الفاصل الزمني لطباعة حالة المسارات النشطة. |
OPENCLAW_DOCKER_ALL_TIMINGS |
مفعّل | إعادة استخدام .artifacts/docker-tests/lane-timings.json للترتيب من الأطول إلى الأقصر؛ اضبطه على 0 للتعطيل. |
OPENCLAW_DOCKER_ALL_LIVE_MODE |
- | استخدم skip للمسارات الحتمية/المحلية فقط، وonly لمسارات موفري الخدمة المباشرة فقط. الأسماء البديلة: pnpm test:docker:local:all وpnpm test:docker:live:all. يدمج وضع الاختبارات المباشرة فقط المسارات المباشرة الرئيسية واللاحقة في تجمّع واحد مرتب من الأطول إلى الأقصر كي تجمع فئات موفري الخدمة أعمال Claude/Codex/Gemini معًا. |
OPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS |
180 | مهلة إعداد الواجهة الخلفية لـ CLI في Docker. |
نمط متغيرات البيئة لحدود الموارد هو OPENCLAW_DOCKER_ALL_<RESOURCE>_LIMIT (يُحوّل اسم المورد إلى أحرف كبيرة، وتُدمج المحارف غير الأبجدية الرقمية في _).
سلوك آخر: يجري المشغّل فحوصات Docker التمهيدية افتراضيًا، وينظّف حاويات OpenClaw E2E القديمة، ويشارك ذاكرات التخزين المؤقت لأدوات CLI الخاصة بموفّري الخدمة بين المسارات المتوافقة، ويتوقف عن جدولة مسارات مجمّعة جديدة بعد أول فشل ما لم يُضبط OPENCLAW_DOCKER_ALL_FAIL_FAST=0. إذا تجاوز أحد المسارات الحد الفعلي للوزن/الموارد على مضيف منخفض التوازي، فلا يزال بإمكانه البدء من تجمّع فارغ والعمل منفردًا حتى يحرر السعة. تُكتب سجلات كل مسار وsummary.json وfailures.json وتوقيتات المراحل ضمن .artifacts/docker-tests/<run-id>/؛ استخدم pnpm test:docker:timings <summary.json> لفحص المسارات البطيئة، وpnpm test:docker:rerun <run-id|summary.json|failures.json> لطباعة أوامر إعادة تشغيل موجّهة ومنخفضة التكلفة.
مسارات Docker البارزة
| الأمر | ما يتحقق منه |
|---|---|
pnpm test:docker:browser-cdp-snapshot |
حاوية E2E للمصدر مدعومة بـ Chromium مع CDP خام وGateway معزول؛ تتضمن لقطات أدوار CDP الناتجة عن browser doctor --deep عناوين URL للروابط، والعناصر القابلة للنقر التي رُفعت بواسطة المؤشر، ومراجع iframe، والبيانات الوصفية للإطارات. |
pnpm test:docker:skill-install |
يثبّت ملف tarball المجمّع في مشغّل Docker مجرد مع skills.install.allowUploadedArchives: false، ويستخرج المعرّف النصي الحالي لإحدى Skills من بحث ClawHub المباشر، ويثبّتها عبر openclaw skills install، ويتحقق من SKILL.md و.clawhub/origin.json و.clawhub/lock.json وskills info --json. |
pnpm test:docker:live-cli-backend:claude, :claude:resume, :claude:mcp |
اختبارات مباشرة مركّزة للواجهة الخلفية لـ CLI؛ لدى Gemini أسماء بديلة مطابقة هي :resume و:mcp. |
pnpm test:docker:openwebui |
OpenClaw مع Open WebUI ضمن Docker: تسجيل الدخول، وفحص /api/models، وتشغيل محادثة فعلية عبر وكيل من خلال /api/chat/completions. يتطلب مفتاحًا صالحًا لنموذج مباشر ويسحب صورة خارجية؛ ولا يُتوقع أن يكون مستقرًا في CI مثل مجموعات اختبارات الوحدة وE2E. |
pnpm test:docker:mcp-channels |
حاوية Gateway مزوّدة ببيانات أولية مع حاوية عميل تُشغّل openclaw mcp serve: اكتشاف المحادثات الموجّه، وقراءة النصوص المسجلة، والبيانات الوصفية للمرفقات، وسلوك قائمة انتظار الأحداث المباشرة، وتوجيه الإرسال الصادر، وإشعارات القنوات والأذونات بأسلوب Claude عبر جسر stdio الحقيقي (يقرأ التحقق إطارات MCP الخام من stdio مباشرةً). |
pnpm test:docker:upgrade-survivor |
يثبّت ملف tarball المجمّع فوق تجهيز مستخدم قديم غير نظيف، ويشغّل تحديث الحزمة مع أداة الفحص دون تفاعل ومن دون مفاتيح مباشرة لموفّري الخدمة/القنوات، ويبدأ Gateway عبر local loopback، ويتحقق من بقاء إعدادات الوكلاء/القنوات وقوائم السماح للـ Plugin وملفات مساحة العمل/الجلسات وحالة تبعيات Plugin القديمة المتقادمة وحالة بدء التشغيل وRPC سليمة. |
pnpm test:docker:published-upgrade-survivor |
يثبّت openclaw@latest افتراضيًا، ويهيئ ملفات واقعية لمستخدم حالي، ويضبط الإعدادات عبر وصفة مضمنة تستخدم openclaw config set، ثم يحدّث إلى ملف tarball المجمّع، ويشغّل أداة الفحص دون تفاعل، ويكتب .artifacts/upgrade-survivor/summary.json، ويتحقق من /healthz و/readyz وحالة RPC. تجاوز الإعداد باستخدام OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC، أو وسّع مصفوفة باستخدام OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS، أو أضف تجهيزات سيناريو باستخدام OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues (يتضمن configured-plugin-installs وstale-source-plugin-shadow). تعرض ميزة قبول الحزمة هذه القيم باسم published_upgrade_survivor_baseline(s) / _scenarios، وتحل الرموز الوصفية مثل last-stable-4 أو all-since-2026.4.23. |
pnpm test:docker:update-migration |
إطار اختبار نجاة الترقية المنشورة في سيناريو plugin-deps-cleanup، بدءًا من openclaw@2026.4.23 افتراضيًا. يوسّع سير عمل Update Migration ذلك باستخدام baselines=all-since-2026.4.23 لإثبات تنظيف تبعيات Plugin المضبوطة خارج CI للإصدار الكامل. |
pnpm test:docker:plugins |
اختبار دخاني للتثبيت/التحديث للمسار المحلي وحزم سجل npm ذات السابقة file: والتبعيات المرفوعة، ومراجع git المتحركة، وتجهيزات ClawHub، وتحديثات سوق الإضافات، وتمكين/فحص حزمة Claude. |
بوابة طلب السحب المحلية
لفحوصات اعتماد/بوابة طلب السحب المحلية، شغّل:
pnpm check:changedpnpm checkpnpm check:test-typespnpm buildpnpm testpnpm check:docs
إذا تعثر pnpm test بشكل متقطع على مضيف محمّل، فأعد تشغيله مرة واحدة قبل اعتباره تراجعًا، ثم اعزل المشكلة باستخدام pnpm test <path/to/test>. للمضيفين محدودي الذاكرة:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed
أدوات أداء الاختبارات
- يفعّل
pnpm test:perf:importsإعداد تقارير مدة الاستيراد وتفاصيله في Vitest، مع الاستمرار في استخدام توجيه المسارات المحددة للأهداف الصريحة من الملفات/الأدلة. ويحصرpnpm test:perf:imports:changedالتحليل نفسه في الملفات التي تغيرت منذorigin/main. - يقيس
pnpm test:perf:changed:bench -- --ref <git-ref>أداء مسار الوضع المتغير الموجّه مقارنةً بالتشغيل الأصلي للمشروع الجذري لنفس فرق git المُثبَت؛ بينما يقيسpnpm test:perf:changed:bench -- --worktreeأداء مجموعة تغييرات شجرة العمل الحالية من دون تثبيتها أولًا. - يكتب
pnpm test:perf:profile:mainملف تعريف CPU لخيط Vitest الرئيسي (.artifacts/vitest-main-profile)؛ ويكتبpnpm test:perf:profile:runnerملفات تعريف CPU والذاكرة الديناميكية لمشغّل اختبارات الوحدة (.artifacts/vitest-runner-profile). - يشغّل
pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.jsonكل إعداد فرعي لمجموعة Vitest الكاملة تسلسليًا، ويكتب بيانات المدة المجمعة، بالإضافة إلى عناصر JSON/السجل لكل إعداد. تعزل تقارير المجموعة الكاملة الملفات افتراضيًا، كي لا تُحتسب مخططات الوحدات المحتفظ بها وتوقفات GC الناتجة من الملفات السابقة على التأكيدات اللاحقة؛ ولا تمرّر-- --no-isolateإلا عند تحليل تراكم العامل المشترك عمدًا. يستخدم وكيل أداء الاختبارات هذا خطًا أساسًا قبل محاولة إصلاح الاختبارات البطيئة. يقارنpnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.jsonالتقارير المجمعة بعد تغيير يركز على الأداء. - تحدّث عمليات تشغيل الأجزاء الكاملة وأجزاء الإضافات وأجزاء نمط التضمين بيانات التوقيت المحلية في
.artifacts/vitest-shard-timings.json؛ وتستخدم عمليات التشغيل اللاحقة للإعداد الكامل تلك التوقيتات لموازنة الأجزاء البطيئة والسريعة. تُلحق أجزاء CI ذات نمط التضمين اسم الجزء بمفتاح التوقيت، ما يُبقي توقيتات الأجزاء المرشّحة ظاهرة من دون استبدال بيانات توقيت الإعداد الكامل. عيّنOPENCLAW_TEST_PROJECTS_TIMINGS=0لتجاهل عنصر التوقيت المحلي.
قياسات الأداء
زمن استجابة النموذج (scripts/bench-model.ts)
pnpm tsx scripts/bench-model.ts --runs 10متغيرات البيئة الاختيارية: MINIMAX_API_KEY، وMINIMAX_BASE_URL، وMINIMAX_MODEL، وANTHROPIC_API_KEY. الموجّه الافتراضي: «أجب بكلمة واحدة: ok. من دون علامات ترقيم أو نص إضافي.»
بدء تشغيل CLI (scripts/bench-cli-startup.ts)
pnpm test:startup:benchpnpm test:startup:bench:smokepnpm test:startup:bench:savepnpm test:startup:bench:updatepnpm test:startup:bench:checkpnpm tsx scripts/bench-cli-startup.ts --runs 12pnpm tsx scripts/bench-cli-startup.ts --preset real --case status --case gatewayStatus --runs 3pnpm tsx scripts/bench-cli-startup.ts --entry openclaw.mjs --entry-secondary dist/entry.js --preset allالإعدادات المسبقة:
startup:--version، و--help، وhealth، وhealth --json، وstatus --json، وstatusreal:health، وstatus، وstatus --json، وsessions، وsessions --json، وtasks --json، وtasks list --json، وtasks audit --json، وagents list --json، وgateway status، وgateway status --json، وgateway health --json، وconfig get gateway.portall: الإعدادان المسبقان معًا
يتضمن الناتج sampleCount، والمتوسط، وp50، وp95، والقيمة الدنيا/العليا، وتوزيع رمز الخروج/الإشارة، والحد الأقصى لـRSS لكل أمر. يكتب --cpu-prof-dir / --heap-prof-dir ملفات تعريف V8 لكل تشغيل.
الناتج المحفوظ: يكتب pnpm test:startup:bench:smoke إلى .artifacts/cli-startup-bench-smoke.json؛ ويكتب pnpm test:startup:bench:save إلى .artifacts/cli-startup-bench-all.json (runs=5 warmup=1). التثبيت المُدرج في المستودع: test/fixtures/cli-startup-bench.json، ويُحدَّث بواسطة pnpm test:startup:bench:update، وتُجرى مقارنته بواسطة pnpm test:startup:bench:check.
بدء تشغيل Gateway (scripts/bench-gateway-startup.ts)
يستخدم افتراضيًا مدخل CLI المبني في dist/entry.js؛ شغّل pnpm build أولًا. مرّر --entry scripts/run-node.mjs لقياس مشغّل المصدر بدلًا منه، وأبقِ تلك النتائج منفصلة عن الخطوط الأساسية للمدخل المبني.
pnpm test:startup:gateway -- --runs 5 --warmup 1pnpm test:startup:gateway -- --case skipChannels --case fiftyPlugins --runs 5node --import tsx scripts/bench-gateway-startup.ts --case default --runs 5 --output .artifacts/gateway-startup.jsonمعرّفات الحالات: default، وskipChannels (يُتخطى بدء تشغيل القنوات)، وoneInternalHook، وallInternalHooks، وfiftyPlugins (50 Plugin من بيان التعريف)، وfiftyStartupLazyPlugins (50 Plugin من بيان التعريف بتحميل كسول عند بدء التشغيل).
يتضمن الناتج أول ناتج للعملية، و/healthz، و/readyz، ووقت سجل استماع HTTP، ووقت سجل جاهزية Gateway، ووقت CPU، ونسبة نواة CPU، والحد الأقصى لـRSS، والذاكرة الديناميكية، ومقاييس تتبع بدء التشغيل، وتأخير حلقة الأحداث، ومقاييس تفاصيل جدول البحث الخاص بالـPlugin. يعيّن البرنامج النصي OPENCLAW_GATEWAY_STARTUP_TRACE=1 في بيئة Gateway الفرعية.
يمثل /healthz حالة التشغيل (يمكن لخادم HTTP الرد). ويمثل /readyz الجاهزية للاستخدام (استقرت العمليات الجانبية للـPlugin عند بدء التشغيل، والقنوات، والأعمال الحرجة للجاهزية التي تلي الإرفاق). تُرسل خطافات بدء التشغيل بشكل غير متزامن ولا تشكل جزءًا من ضمان الجاهزية. وقت سجل الجاهزية هو الطابع الزمني الداخلي لـGateway، وهو مفيد لإسناد الوقت إلى العملية، لكنه ليس بديلًا عن فحص /readyz الخارجي.
استخدم ناتج JSON أو --output عند مقارنة التغييرات. ولا تستخدم --cpu-prof-dir إلا بعد أن يشير ناتج التتبع إلى أعمال استيراد أو ترجمة برمجية أو أعمال مقيّدة بالـCPU لا تستطيع توقيتات المراحل وحدها تفسيرها.
إعادة تشغيل Gateway (scripts/bench-gateway-restart.ts)
لنظامي macOS وLinux فقط (يستخدم SIGUSR1 لإعادة التشغيل داخل العملية؛ ويفشل فورًا على Windows). يستخدم الإعداد الافتراضي نفسه للمدخل المبني، وخيار التجاوز --entry scripts/run-node.mjs نفسه المستخدم في بدء تشغيل Gateway أعلاه.
pnpm test:restart:gateway -- --case skipChannels --runs 1 --restarts 5pnpm test:restart:gateway -- --case default --runs 3 --restarts 3 --warmup 1معرّفات الحالات: skipChannels، وskipChannelsAcpxProbe (فحص بدء تشغيل ACPX مفعّل)، وskipChannelsNoAcpxProbe (الفحص معطّل)، وdefault، وfiftyPlugins.
يتضمن الناتج حالة /healthz التالية، وحالة /readyz التالية، ومدة التوقف، وتوقيت الجاهزية بعد إعادة التشغيل، وCPU، وRSS، ومقاييس تتبع بدء تشغيل العملية البديلة، ومقاييس تتبع إعادة التشغيل لمعالجة الإشارة، وانتظار انتهاء العمل النشط، ومراحل الإغلاق، وبدء التشغيل التالي، وتوقيت الجاهزية، ولقطات الذاكرة. يعيّن البرنامج النصي OPENCLAW_GATEWAY_STARTUP_TRACE=1 وOPENCLAW_GATEWAY_RESTART_TRACE=1.
استخدم مقياس الأداء هذا عندما يمس تغييرٌ ما إشارات إعادة التشغيل، أو معالجات الإغلاق، أو بدء التشغيل بعد إعادة التشغيل، أو إيقاف العمليات الجانبية، أو تسليم الخدمة، أو الجاهزية بعد إعادة التشغيل. ابدأ بـskipChannels لعزل آليات Gateway عن بدء تشغيل القنوات؛ ولا تستخدم default أو الحالات كثيفة الـPlugin إلا بعد أن تفسّر الحالة المحدودة مسار إعادة التشغيل. مقاييس التتبع تلميحات للإسناد وليست أحكامًا — قيّم تغيير إعادة التشغيل باستخدام عينات متعددة، ونطاق المالك المطابق، وسلوك /healthz//readyz، وعقد إعادة التشغيل الظاهر للمستخدم.
الاختبار الشامل للتأهيل (Docker)
اختياري؛ ولا يلزم إلا لاختبارات الدخان للتأهيل داخل الحاويات. تدفق بدء التشغيل البارد الكامل داخل حاوية Linux نظيفة:
scripts/e2e/onboard-docker.shيشغّل المعالج التفاعلي عبر طرفية زائفة، ويتحقق من ملفات الإعداد/مساحة العمل/الجلسة، ثم يبدأ Gateway ويشغّل openclaw health.
اختبار دخان استيراد QR (Docker)
يضمن تحميل مساعد وقت تشغيل QR المُصان ضمن بيئات تشغيل Docker Node المدعومة (Node 24 افتراضيًا، ومتوافق مع Node 22):
pnpm test:docker:qr