Testing
الاختبار
لدى OpenClaw ثلاث حزم اختبارات Vitest (الوحدة/التكامل، وe2e، والمباشرة) بالإضافة إلى مشغّلات Docker. تغطي هذه الصفحة نطاق كل حزمة، والأمر المطلوب تشغيله لسير عمل معيّن، وكيفية اكتشاف الاختبارات المباشرة لبيانات الاعتماد، وكيفية إضافة اختبارات انحدار لأخطاء المزوّدات/النماذج الواقعية.
البدء السريع
في معظم الأيام:
- بوابة التحقق الكاملة (متوقعة قبل الدفع):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - تشغيل محلي أسرع للحزمة الكاملة على جهاز ذي موارد كافية:
pnpm test:max - حلقة المراقبة المباشرة لـ Vitest:
pnpm test:watch - يوجّه الاستهداف المباشر للملفات مسارات Plugins/القنوات أيضًا:
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
عندما تعدّل الاختبارات أو تريد ثقة إضافية:
- تقرير تغطية V8 معلوماتي:
pnpm test:coverage - حزمة E2E:
pnpm test:e2e
أدلة الاختبارات المؤقتة
استخدم الأدوات المساعدة المشتركة في test/helpers/temp-dir.ts للأدلة المؤقتة
المملوكة للاختبارات، بحيث تكون الملكية صريحة ويظل التنظيف ضمن دورة حياة الاختبار:
const tempDirs = useAutoCleanupTempDirTracker(afterEach); it("uses a temp workspace", () => { const workspace = tempDirs.make("openclaw-example-"); // use workspace});لا تعرض useAutoCleanupTempDirTracker(afterEach) عمدًا أي طريقة تنظيف
يدوية، إذ يتولى Vitest التنظيف بعد كل اختبار. لا تزال الأدوات المساعدة
الأقدم منخفضة المستوى (makeTempDir، وcleanupTempDirs، وcreateTempDirTracker)
موجودة للاختبارات التي لم تُرحّل بعد؛ تجنّب استخدامها في التعليمات البرمجية الجديدة،
وتجنّب استدعاءات fs.mkdtemp* المباشرة الجديدة ما لم يكن الاختبار يتحقق صراحةً
من سلوك الدليل المؤقت الخام. عندما تكون هناك حاجة فعلية إلى دليل مؤقت مباشر،
أضف تعليق سماح قابلًا للتدقيق مع ذكر السبب:
// openclaw-temp-dir: allow verifies raw fs cleanup behaviorconst workspace = fs.mkdtempSync(prefix);يُبلغ node scripts/report-test-temp-creations.mjs عن إنشاء أدلة مؤقتة
مباشرة جديدة وعن الاستخدام اليدوي الجديد للأداة المساعدة المشتركة ضمن أسطر
الفروقات المضافة، من دون حظر أساليب التنظيف الحالية. وهو يتبع تصنيف مسارات
الاختبارات نفسه المستخدم في scripts/changed-lanes.mjs ويتخطى تنفيذ الأداة
المساعدة المشتركة نفسه. يشغّل check:changed هذا التقرير لمسارات الاختبارات
المعدّلة بصفته إشارة تحذيرية فقط في CI (تعليقات تحذير توضيحية من GitHub، وليست إخفاقات).
مهام سير العمل المباشرة ومهام Docker/Parallels
عند تصحيح أخطاء المزوّدات/النماذج الفعلية (يتطلب بيانات اعتماد فعلية):
- الحزمة المباشرة (النماذج + اختبارات أدوات/صور Gateway):
pnpm test:live - استهدف ملفًا مباشرًا واحدًا بهدوء:
pnpm test:live -- src/agents/models.profiles.live.test.ts - تقارير أداء وقت التشغيل: شغّل
OpenClaw Performanceمعlive_openai_candidate=trueلتنفيذ دورة وكيل فعلية باستخدامopenai/gpt-5.6-luna، أوdeep_profile=trueللحصول على عناصر Kova الخاصة بوحدة المعالجة المركزية/الكومة/التتبّع. تنشر عمليات التشغيل اليومية المجدولة تقارير مسارات المزوّد الوهمي، والتنميط العميق، وGPT-5.6 Luna إلىopenclaw/clawgrit-reportsمن مهمة ناشر منفصلة تستهلك العناصر؛ يؤدي غياب مصادقة الناشر أو عدم صلاحيتها إلى فشل عمليات التشغيل المجدولة وعملياتprofile=release. تحتفظ عمليات التشغيل اليدوية غير الخاصة بالإصدار بعناصر GitHub وتتعامل مع نشر التقارير بوصفه إرشاديًا. يتضمن تقرير المزوّد الوهمي أيضًا أرقام تشغيل Gateway على مستوى المصدر، والذاكرة، وضغط Plugins، وحلقة الترحيب المتكررة للنموذج الوهمي، وبدء تشغيل CLI. - مسح النماذج المباشر عبر 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 باستخدام
/codex bind، ويختبر/codex fastو/codex permissions، ثم يتحقق من توجيه رد عادي ومرفق صورة عبر ارتباط Plugin الأصلي بدلًا من ACP.
- يشغّل مسارًا مباشرًا في Docker مقابل مسار خادم تطبيق Codex، ويربط
رسالة مباشرة اصطناعية في Slack باستخدام
- اختبار دخان لحاضنة خادم تطبيق Codex:
pnpm test:docker:live-codex-harness- يشغّل دورات وكيل Gateway عبر حاضنة خادم تطبيق Codex
المملوكة لـ Plugin، ويتحقق من
/codex statusو/codex models، ويختبر افتراضيًا الصورة، وCron MCP، والوكيل الفرعي، واختبارات Guardian. عطّل اختبار الوكيل الفرعي باستخدامOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0عند عزل إخفاقات أخرى. ولإجراء فحص مركّز للوكيل الفرعي، عطّل الاختبارات الأخرى: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.
- يشغّل دورات وكيل Gateway عبر حاضنة خادم تطبيق Codex
المملوكة لـ Plugin، ويتحقق من
- اختبار دخان لتثبيت Codex عند الطلب:
pnpm test:docker:codex-on-demand- يثبّت حزمة OpenClaw المضغوطة في Docker، ويشغّل الإعداد الأولي
باستخدام مفتاح OpenAI API، ويتحقق من تنزيل Plugin الخاص بـ Codex واعتمادية
@openai/codexعند الطلب إلى جذر مشروع npm المُدار.
- يثبّت حزمة OpenClaw المضغوطة في Docker، ويشغّل الإعداد الأولي
باستخدام مفتاح OpenAI API، ويتحقق من تنزيل Plugin الخاص بـ Codex واعتمادية
- اختبار دخان مباشر لاعتمادية أداة Plugin:
pnpm test:docker:live-plugin-tool- يحزم Plugin تجريبيًا باعتمادية
slugifyفعلية، ويثبّته من خلالnpm-pack:، ويتحقق من الاعتمادية تحت جذر مشروع npm المُدار، ثم يطلب من نموذج OpenAI مباشر استدعاء أداة Plugin وإرجاع المعرّف المختصر المخفي.
- يحزم Plugin تجريبيًا باعتمادية
- اختبار دخان لأمر الإنقاذ في Crestodian:
pnpm test:live:crestodian-rescue-channel- فحص اختياري احتياطي مزدوج لواجهة أمر الإنقاذ في
قناة الرسائل. يختبر
/crestodian status، ويضع تغيير نموذج دائمًا في قائمة الانتظار، ويرد بـ/crestodian yes، ويتحقق من مسار كتابة التدقيق/الإعدادات.
- فحص اختياري احتياطي مزدوج لواجهة أمر الإنقاذ في
قناة الرسائل. يختبر
- اختبار دخان لأول تشغيل لـ Crestodian عبر Docker:
pnpm test:docker:crestodian-first-run- يبدأ من دليل حالة OpenClaw فارغ ويثبت أولًا أن CLI المضمّن
openclaw crestodianيفشل بشكل مغلق من دون استدلال. ثم يختبر Claude الوهمي ويفعّله من خلال وحدة التفعيل المضمّنة. وبعد ذلك فقط يصل طلب CLI مضمّن تقريبي إلى المخطّط ويُحلّ إلى إعداد نمطي، تتبعه عمليات أحادية التنفيذ للنموذج، والوكيل، وPlugin الخاص بـ Discord، وSecretRef. ويتحقق من الإعدادات ومدخلات التدقيق. يُعد هذا دليلًا داعمًا للبوابة/العمليات، وليس إثباتًا للإعداد الأولي التفاعلي أو وكيل/أداة/موافقة Crestodian. يتوفر المسار نفسه في مختبر ضمان الجودة عبرpnpm openclaw qa suite --scenario crestodian-ring-zero-setup.
- يبدأ من دليل حالة OpenClaw فارغ ويثبت أولًا أن CLI المضمّن
- اختبار دخان لتكلفة 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بعد توحيده.
المشغّلات الخاصة بضمان الجودة
توجد هذه الأوامر بجانب حزم الاختبارات الرئيسية عندما تحتاج إلى واقعية مختبر ضمان الجودة.
يشغّل CI مختبر ضمان الجودة في مهام سير عمل مخصصة. يُدرج التكافؤ الوكيلي ضمن
QA-Lab - All Lanes والتحقق من الإصدار، وليس ضمن سير عمل مستقل لطلبات السحب.
يجب أن يستخدم التحقق الواسع Full Release Validation مع
rerun_group=qa-parity أو مجموعة ضمان الجودة لفحوص الإصدار. تُبقي فحوص الإصدار
المستقرة/الافتراضية اختبارات التحمل المباشرة/Docker الشاملة خلف run_release_soak=true؛
بينما يفرض ملف التعريف full تشغيل اختبارات التحمل. يعمل QA-Lab - All Lanes ليليًا على main
ومن التشغيل اليدوي، مع مسار التكافؤ الوهمي، ومسار Matrix المباشر،
ومسار Telegram المباشر المُدار بواسطة Convex، ومسار Discord المباشر المُدار بواسطة Convex،
بوصفها مهام متوازية. تمرّر مهام ضمان الجودة المجدولة وفحوص الإصدار الخيار
--profile fast إلى Matrix صراحةً، بينما تظل القيمة الافتراضية لـ CLI الخاص بـ Matrix
وإدخال سير العمل اليدوي هي all؛ ويمكن للتشغيل اليدوي تقسيم all إلى مهام
transport، وmedia، وe2ee-smoke، وe2ee-deep، وe2ee-cli.
يشغّل OpenClaw Release Checks التكافؤ بالإضافة إلى مساري Matrix السريع وTelegram
قبل الموافقة على الإصدار، باستخدام mock-openai/gpt-5.6-luna لفحوص نقل الإصدار
كي تظل حتمية وتتجنب بدء تشغيل Plugin المزوّد العادي. تعطّل بوابات النقل
المباشر هذه البحث في الذاكرة؛ ويظل سلوك الذاكرة مغطى بحزم تكافؤ ضمان الجودة.
تستخدم أقسام الوسائط المباشرة للإصدار الكامل
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04، التي تتضمن مسبقًا
ffmpeg وffprobe. تستخدم أقسام النماذج/الخلفيات المباشرة عبر Docker صورة
ghcr.io/openclaw/openclaw-live-test:<sha> المشتركة، التي تُبنى مرة واحدة لكل
التزام محدد، ثم تسحبها باستخدام OPENCLAW_SKIP_DOCKER_BUILD=1 بدلًا من إعادة بنائها
داخل كل قسم.
pnpm openclaw qa suite- يشغّل سيناريوهات ضمان الجودة المدعومة بالمستودع مباشرةً على المضيف.
- ينشئ في المستوى الأعلى ملفات الأدلة
qa-evidence.jsonوqa-suite-summary.jsonوqa-suite-report.mdلمجموعة السيناريوهات المحددة، بما في ذلك اختيارات سيناريوهات التدفق المختلط وVitest وPlaywright. - عند تشغيله بواسطة
pnpm openclaw qa run --qa-profile <profile>، يضمّن بطاقة تقييم ملف التصنيف المحدد في ملفqa-evidence.jsonنفسه. يكتبsmoke-ciأدلة مختصرة (evidenceMode: "slim"، من دونexecutionلكل إدخال). يغطيreleaseالشريحة المنسّقة لجاهزية الإصدار؛ ويحددallكل فئات النضج النشطة ويستهدف عمليات التشغيل الصريحة لسير عمل أدلة ملف ضمان الجودة عندما تكون هناك حاجة إلى ملف بطاقة تقييم كامل. - يشغّل عدة سيناريوهات محددة بالتوازي افتراضيًا باستخدام عمال
Gateway معزولين. يستخدم
qa-channelتزامنًا افتراضيًا قدره 4 (مقيّدًا بعدد السيناريوهات المحددة). استخدم--concurrency <count>لضبط عدد العمال، أو--concurrency 1للمسار التسلسلي الأقدم. - ينهي التنفيذ برمز غير صفري عند فشل أي سيناريو. استخدم
--allow-failuresلإنشاء الملفات دون رمز خروج يشير إلى الفشل. - يدعم أوضاع المزوّد
live-frontierوmock-openaiوaimock. يبدأaimockخادم مزوّد محليًا مدعومًا بـAIMock لتغطية التركيبات التجريبية ومحاكاة البروتوكول دون استبدال مسارmock-openaiالمدرك للسيناريوهات.
pnpm openclaw qa coverage --match <query>- يبحث في معرّفات السيناريوهات وعناوينها وأسطرحها ومعرّفات التغطية ومراجع الوثائق ومراجع الشيفرة وplugins ومتطلبات المزوّدين، ثم يطبع أهداف الحزمة المطابقة.
- استخدم هذا قبل تشغيل مختبر ضمان الجودة عندما تعرف السلوك المتأثر أو مسار الملف، لكنك لا تعرف أصغر سيناريو. هذا إرشادي فقط — ولا يزال عليك اختيار دليل المحاكاة أو التشغيل الفعلي أو Multipass أو Matrix أو النقل بناءً على السلوك الذي يجري تغييره.
pnpm test:plugins:kitchen-sink-live- يشغّل مجموعة اختبارات Plugin OpenAI Kitchen Sink الفعلية عبر مختبر ضمان الجودة.
يثبّت حزمة Kitchen Sink الخارجية، ويتحقق من جرد أسطح plugin SDK،
ويفحص
/healthzو/readyz، ويسجّل أدلة CPU/RSS الخاصة بـGateway، ويشغّل دورة OpenAI فعلية، ويتحقق من التشخيصات العدائية. يتطلب مصادقة OpenAI فعلية مثلOPENAI_API_KEY. في جلسات Testbox المجهّزة، يحمّل تلقائيًا ملف المصادقة الفعلية الخاص بـTestbox عند توفر مساعدopenclaw-testbox-env.
- يشغّل مجموعة اختبارات Plugin OpenAI Kitchen Sink الفعلية عبر مختبر ضمان الجودة.
يثبّت حزمة Kitchen Sink الخارجية، ويتحقق من جرد أسطح plugin SDK،
ويفحص
pnpm test:gateway:cpu-scenarios- يشغّل اختبار أداء بدء تشغيل Gateway بالإضافة إلى حزمة صغيرة من سيناريوهات مختبر ضمان الجودة المحاكية
(
channel-chat-baselineوmemory-failure-fallbackوgateway-restart-inflight-run) ويكتب ملخصًا مجمعًا لملاحظات CPU ضمن.artifacts/gateway-cpu-scenarios/. - لا يضع علامات افتراضيًا إلا على ملاحظات الاستهلاك المرتفع المستمر للمعالج (
--cpu-core-warn، وقيمته الافتراضية0.9؛ و--hot-wall-warn-ms، وقيمته الافتراضية30000)، لذلك تُسجّل اندفاعات بدء التشغيل القصيرة كمقاييس دون أن تبدو كتراجع تثبيت Gateway الذي يستمر دقائق. - يعمل على ملفات
distالمبنية؛ نفّذ عملية بناء أولًا عندما لا تحتوي نسخة العمل بالفعل على مخرجات تشغيل حديثة.
- يشغّل اختبار أداء بدء تشغيل Gateway بالإضافة إلى حزمة صغيرة من سيناريوهات مختبر ضمان الجودة المحاكية
(
pnpm openclaw qa suite --runner multipass- يشغّل حزمة ضمان الجودة نفسها داخل جهاز Linux افتراضي مؤقت من Multipass، مع الاحتفاظ
بأعلام تحديد السيناريوهات والمزوّد/النموذج نفسها المستخدمة في
qa suite. - تمرّر عمليات التشغيل الفعلية مدخلات مصادقة ضمان الجودة المناسبة للضيف:
مفاتيح المزوّد المستندة إلى متغيرات البيئة، ومسار إعدادات مزوّد التشغيل الفعلي لضمان الجودة، و
CODEX_HOMEعند توفره. - يجب أن تبقى مجلدات المخرجات ضمن جذر المستودع حتى يتمكن الضيف من الكتابة عبر مساحة العمل المركّبة.
- يكتب تقرير ضمان الجودة وملخصه المعتادين، بالإضافة إلى سجلات Multipass ضمن
.artifacts/qa-e2e/....
- يشغّل حزمة ضمان الجودة نفسها داخل جهاز Linux افتراضي مؤقت من Multipass، مع الاحتفاظ
بأعلام تحديد السيناريوهات والمزوّد/النموذج نفسها المستخدمة في
pnpm qa:lab:up- يبدأ موقع ضمان الجودة المدعوم بـDocker لأعمال ضمان الجودة بأسلوب المشغّلين.
pnpm test:docker:npm-onboard-channel-agent- يبني حزمة tarball خاصة بـnpm من نسخة العمل الحالية، ويثبّتها عموميًا داخل Docker، ويشغّل إعداد مفتاح واجهة OpenAI API دون تفاعل، ويضبط Telegram افتراضيًا، ويتحقق من تحميل وقت تشغيل plugin المضمّن دون إصلاح تبعيات بدء التشغيل، ويشغّل doctor، ثم يشغّل دورة واحدة للوكيل المحلي على نقطة نهاية OpenAI محاكية.
- استخدم
OPENCLAW_NPM_ONBOARD_CHANNEL=discordلتشغيل مسار تثبيت الحزمة نفسه مع Discord.
pnpm test:docker:session-runtime-context- يشغّل اختبار دخان حتميًا داخل Docker للتطبيق المبني، خاصًا بنصوص سياق وقت التشغيل
المضمّنة. يتحقق من استمرار سياق وقت تشغيل OpenClaw المخفي بصفته
رسالة مخصصة غير معروضة بدلًا من تسرّبه إلى دورة المستخدم
المرئية، ثم يضيف بيانات أولية إلى جلسة JSONL معطلة متأثرة ويتحقق من أن
openclaw doctor --fixيعيد كتابتها إلى الفرع النشط مع نسخة احتياطية.
- يشغّل اختبار دخان حتميًا داخل Docker للتطبيق المبني، خاصًا بنصوص سياق وقت التشغيل
المضمّنة. يتحقق من استمرار سياق وقت تشغيل OpenClaw المخفي بصفته
رسالة مخصصة غير معروضة بدلًا من تسرّبه إلى دورة المستخدم
المرئية، ثم يضيف بيانات أولية إلى جلسة JSONL معطلة متأثرة ويتحقق من أن
pnpm test:docker:npm-telegram-live- يثبّت حزمة OpenClaw مرشحة داخل Docker، ويشغّل إعداد الحزمة المثبّتة، ويضبط Telegram عبر CLI المثبّت، ثم يعيد استخدام مسار ضمان الجودة الفعلي الخاص بـTelegram مع تلك الحزمة المثبّتة باعتبار Gateway النظام الخاضع للاختبار.
- يركّب الغلاف مصدر أداة
qa-labفقط من نسخة العمل؛ وتملك الحزمة المثبّتةdistوopenclaw/plugin-sdkووقت تشغيل plugin المضمّن، ولذلك لا يخلط المسار plugins الخاصة بنسخة العمل الحالية داخل الحزمة الخاضعة للاختبار. - القيمة الافتراضية هي
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta؛ عيّنOPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzأوOPENCLAW_CURRENT_PACKAGE_TGZلاختبار حزمة tarball محلية محلولة بدلًا من التثبيت من السجل. - يصدر قياسات توقيت RTT متكررة في
qa-evidence.jsonافتراضيًا باستخدامOPENCLAW_NPM_TELEGRAM_RTT_SAMPLES=20. تجاوزOPENCLAW_NPM_TELEGRAM_RTT_SAMPLESأوOPENCLAW_NPM_TELEGRAM_RTT_TIMEOUT_MSأوOPENCLAW_NPM_TELEGRAM_RTT_MAX_FAILURESلضبط التشغيل. يقبلOPENCLAW_NPM_TELEGRAM_RTT_CHECKSقائمة مفصولة بفواصل من معرّفات فحوص ضمان الجودة الخاصة بـTelegram لأخذ عينات منها؛ وعند عدم تعيينه، يكون الفحص الافتراضي القادر على قياس RTT هوtelegram-mentioned-message-reply. - يستخدم بيانات اعتماد Telegram نفسها المستمدة من متغيرات البيئة أو مصدر بيانات اعتماد Convex نفسه
مثل
pnpm openclaw qa telegram. لأتمتة CI/الإصدار، عيّنOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexبالإضافة إلىOPENCLAW_QA_CONVEX_SITE_URLوسرّ الدور. إذا كانOPENCLAW_QA_CONVEX_SITE_URLوسرّ دور Convex موجودين في CI، فسيحدد غلاف Docker Convex تلقائيًا. - يتحقق الغلاف من متغيرات بيئة بيانات اعتماد Telegram أو Convex على المضيف
قبل أعمال البناء/التثبيت داخل Docker. عيّن
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1فقط عند تصحيح إعداد ما قبل بيانات الاعتماد عمدًا. - يتجاوز
OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainerالقيمة المشتركةOPENCLAW_QA_CREDENTIAL_ROLEلهذا المسار فقط. عند تحديد بيانات اعتماد Convex وعدم تعيين دور، يستخدم الغلافciداخل CI وmaintainerخارجه. - يوفّر GitHub Actions هذا المسار أيضًا كسير عمل يدوي للمشرفين
NPM Telegram Beta E2E. ولا يعمل عند الدمج. يستخدم سير العمل بيئةqa-live-sharedوتأجيرات بيانات اعتماد Convex الخاصة بـCI.
- يوفّر GitHub Actions أيضًا
Package Acceptanceلإثبات المنتج بتشغيل جانبي على حزمة مرشحة واحدة. ويقبل مرجع Git، أو مواصفة npm منشورة، أو عنوان URL لحزمة tarball عبر HTTPS مع SHA-256، أو سياسة عنوان URL موثوق، أو ملف حزمة tarball من تشغيل آخر (source=ref|npm|url|trusted-url|artifact)، ويرفع ملفopenclaw-current.tgzالموحّد باسمpackage-under-test، ثم يشغّل مجدول اختبارات Docker الشاملة الحالي باستخدام ملفات مساراتsmokeأوpackageأوproductأوfullأوcustom. عيّنtelegram_mode=mock-openaiأوlive-frontierلتشغيل سير عمل ضمان الجودة الخاص بـTelegram على ملفpackage-under-testنفسه.- أحدث إثبات لمنتج الإصدار التجريبي:
gh workflow run package-acceptance.yml --ref main \ -f source=npm \ -f package_spec=openclaw@beta \ -f suite_profile=product \ -f telegram_mode=mock-openai- يتطلب إثبات عنوان URL الدقيق لحزمة tarball قيمة تجزئة، ويستخدم سياسة أمان عناوين URL العامة:
gh workflow run package-acceptance.yml --ref main \ -f source=url \ -f package_url=https://registry.npmjs.org/openclaw/-/openclaw-VERSION.tgz \ -f package_sha256=<sha256> \ -f suite_profile=package- تستخدم مرايا حزم tarball المؤسسية/الخاصة سياسة صريحة للمصدر الموثوق:
gh workflow run package-acceptance.yml --ref main \ -f source=trusted-url \ -f trusted_source_id=enterprise-artifactory \ -f package_url=https://packages.example.internal:8443/artifactory/openclaw/openclaw-VERSION.tgz \ -f package_sha256=<sha256> \ -f suite_profile=packageيقرأ source=trusted-url الملف .github/package-trusted-sources.json من مرجع سير العمل الموثوق، ولا يقبل بيانات اعتماد في عنوان URL أو تجاوزًا للشبكة الخاصة عبر مدخلات سير العمل. إذا كانت السياسة المسماة تعلن مصادقة برمز حامل، فاضبط السر الثابت OPENCLAW_TRUSTED_PACKAGE_TOKEN.
- ينزّل إثبات الملف حزمة tarball من تشغيل Actions آخر:
gh workflow run package-acceptance.yml --ref main \ -f source=artifact \ -f artifact_run_id=<run-id> \ -f artifact_name=<artifact-name> \ -f suite_profile=smoke-
pnpm test:docker:plugins- يحزم بنية OpenClaw الحالية ويثبّتها داخل Docker، ويبدأ Gateway مع ضبط OpenAI، ثم يفعّل القنوات/plugins المضمّنة عبر تعديلات الإعدادات.
- يتحقق من أن اكتشاف الإعداد يُبقي plugins القابلة للتنزيل وغير المضبوطة غائبة، وأن أول إصلاح مضبوط بواسطة doctor يثبّت كل plugin مفقود قابل للتنزيل صراحةً، وأن إعادة التشغيل الثانية لا تنفّذ إصلاحًا مخفيًا للتبعيات.
- يثبّت أيضًا خط أساس أقدم معروفًا من npm، ويفعّل Telegram قبل
تشغيل
openclaw update --tag <candidate>، ويتحقق من أن doctor الخاص بما بعد تحديث المرشح ينظّف بقايا تبعيات plugin القديمة دون إصلاح postinstall من جانب أداة الاختبار.
-
pnpm test:parallels:npm-update-
يشغّل اختبار دخان تحديث التثبيت المحزّم الأصلي عبر ضيوف Parallels. تثبّت كل منصة محددة أولًا حزمة خط الأساس المطلوبة، ثم تشغّل أمر
openclaw updateالمثبّت داخل الضيف نفسه، وتتحقق من الإصدار المثبّت وحالة التحديث وجاهزية Gateway ودورة واحدة للوكيل المحلي. -
استخدم
--platform macosأو--platform windowsأو--platform linuxأثناء العمل التكراري على ضيف واحد. استخدم--jsonللحصول على مسار ملف الملخص وحالة كل مسار. -
يستخدم مسار OpenAI النموذج
openai/gpt-5.6-lunaلإثبات دورة الوكيل الفعلية افتراضيًا. مرّر--model <provider/model>أو عيّنOPENCLAW_PARALLELS_OPENAI_MODELللتحقق من نموذج OpenAI آخر. -
أحط عمليات التشغيل المحلية الطويلة بمهلة زمنية على المضيف حتى لا تستهلك حالات تعطل نقل Parallels بقية نافذة الاختبار:
bash timeout --foreground 150m pnpm test:parallels:npm-update -- --jsontimeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json -
يكتب البرنامج النصي سجلات المسارات المتداخلة ضمن
/tmp/openclaw-parallels-npm-update.*. افحصwindows-update.logأوmacos-update.logأوlinux-update.logقبل افتراض أن الغلاف الخارجي عالق. -
قد يستغرق تحديث Windows من 10 إلى 15 دقيقة في أعمال doctor لما بعد التحديث وتحديث الحزمة على ضيف بارد؛ ويظل ذلك سليمًا ما دام سجل تصحيح npm المتداخل يتقدم.
-
لا تشغّل هذا الغلاف التجميعي بالتوازي مع مسارات اختبار الدخان الفردية لـParallels على macOS أو Windows أو Linux. فهي تشترك في حالة الجهاز الافتراضي وقد تتعارض عند استعادة اللقطة أو تقديم الحزمة أو حالة Gateway لدى الضيف.
-
يشغّل إثبات ما بعد التحديث سطح plugin المضمّن المعتاد لأن واجهات القدرات مثل الكلام وتوليد الصور وفهم الوسائط تُحمّل عبر واجهات API لوقت التشغيل المضمّن، حتى عندما لا تتحقق دورة الوكيل نفسها إلا من استجابة نصية بسيطة.
-
-
pnpm openclaw qa aimock- يشغّل فقط خادم موفّر AIMock المحلي لإجراء اختبارات دخان مباشرة للبروتوكول.
-
pnpm openclaw qa matrix- يشغّل مسار ضمان الجودة الحي لـ Matrix على خادم Tuwunel منزلي مؤقت
مدعوم بـ Docker. متاح فقط من نسخة الشيفرة المصدرية؛ لا تتضمن عمليات التثبيت
المعبأة
qa-lab. - CLI الكامل، ودليل الملفات الشخصية/السيناريوهات، ومتغيرات البيئة، وتخطيط العناصر: ضمان جودة Matrix.
- يشغّل مسار ضمان الجودة الحي لـ Matrix على خادم Tuwunel منزلي مؤقت
مدعوم بـ Docker. متاح فقط من نسخة الشيفرة المصدرية؛ لا تتضمن عمليات التثبيت
المعبأة
-
pnpm openclaw qa telegram- يشغّل مسار ضمان الجودة الحي لـ Telegram على مجموعة خاصة حقيقية باستخدام رموز بوت المشغّل والنظام قيد الاختبار من البيئة.
- يتطلب
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للاشتراك في التأجيرات المجمّعة. - تغطي الإعدادات الافتراضية الاختبار الكناري، وتقييد الإشارات، وعنونة الأوامر، و
/status، والردود من بوت إلى بوت عند الإشارة، وردود الأوامر الأصلية الأساسية. تغطي إعداداتmock-openaiالافتراضية أيضًا سلسلة الردود الحتمية وانحدارات بث الرسالة النهائية في Telegram. استخدم--list-scenariosلعمليات الفحص الاختيارية مثلsession_status. - يخرج برمز غير صفري عند فشل أي سيناريو. استخدم
--allow-failuresلإنشاء العناصر من دون رمز خروج دال على الفشل. - يتطلب بوتين مختلفين في المجموعة الخاصة نفسها، مع إتاحة بوت النظام قيد الاختبار اسم مستخدم في Telegram.
- لضمان مراقبة مستقرة من بوت إلى بوت، فعّل Bot-to-Bot Communication Mode
في
@BotFatherلكلا البوتين، وتأكد من قدرة بوت المشغّل على مراقبة حركة البوتات في المجموعة. - يكتب تقرير ضمان جودة Telegram وملخصًا و
qa-evidence.jsonضمن.artifacts/qa-e2e/.... تتضمن سيناريوهات الرد زمن الذهاب والإياب من طلب إرسال المشغّل إلى رد النظام قيد الاختبار المرصود.
Mantis Telegram Live هو غلاف أدلة طلب السحب حول هذا المسار. يشغّل
المرجع المرشح باستخدام بيانات اعتماد Telegram مؤجّرة من Convex، ويعرض
حزمة تقرير/أدلة ضمان الجودة المنقّحة في متصفح سطح مكتب Crabbox، ويسجل أدلة
MP4، وينشئ ملف GIF مقتطعًا حسب الحركة، ويرفع حزمة العناصر، وينشر أدلة مضمنة
في طلب السحب عبر تطبيق Mantis في GitHub عند تعيين pr_number. يمكن للمشرفين
بدء تشغيله من واجهة Actions عبر Mantis Scenario
(scenario_id: telegram-live) أو مباشرة من تعليق على طلب سحب:
@openclaw-mantis telegram@openclaw-mantis telegram scenario=telegram-status-command@openclaw-mantis telegram scenarios=telegram-status-command,telegram-mentioned-message-replyMantis Telegram Desktop Proof هو غلاف وكيل Telegram Desktop الأصلي
لما قبل التغيير وبعده، والمخصص للإثبات المرئي لطلب السحب. شغّله من واجهة Actions باستخدام
instructions حرة الصياغة، أو عبر Mantis Scenario (scenario_id: telegram-desktop-proof)، أو من تعليق على طلب سحب:
@openclaw-mantis telegram desktop proofيقرأ وكيل Mantis طلب السحب، ويحدد أي سلوك ظاهر في Telegram يثبت
التغيير، ويشغّل مسار إثبات Telegram Desktop لمستخدم حقيقي عبر Crabbox على
مرجعي خط الأساس والمرشح، ويكرر العملية حتى تصبح ملفات GIF الأصلية مفيدة،
ويكتب بيان motionPreview مزدوجًا، وينشر جدول GIF نفسه ذي العمودين
عبر تطبيق Mantis في GitHub عند تعيين pr_number.
pnpm openclaw qa mantis telegram-desktop-builder- يستأجر سطح مكتب Linux من Crabbox أو يعيد استخدامه، ويثبّت Telegram Desktop الأصلي، ويضبط OpenClaw باستخدام رمز بوت النظام قيد الاختبار في Telegram مستأجر، ويشغّل Gateway، ويسجل أدلة لقطات الشاشة/MP4 من سطح مكتب VNC الظاهر.
- يستخدم
--credential-source convexافتراضيًا كي لا تحتاج مهام سير العمل إلا إلى سر وسيط Convex. استخدم--credential-source envمع متغيراتOPENCLAW_QA_TELEGRAM_*نفسها المستخدمة معpnpm openclaw qa telegram. - لا يزال Telegram Desktop يحتاج إلى تسجيل دخول/ملف شخصي لمستخدم. يضبط رمز البوت
OpenClaw فقط. استخدم
--telegram-profile-archive-env <name>لأرشيف ملف شخصي.tgzبترميز base64، أو استخدم--keep-leaseوسجّل الدخول يدويًا عبر VNC مرة واحدة. - يكتب
mantis-telegram-desktop-builder-report.md، وmantis-telegram-desktop-builder-summary.json، وtelegram-desktop-builder.png، وtelegram-desktop-builder.mp4ضمن دليل الإخراج.
تشترك مسارات النقل الحية في عقد قياسي واحد حتى لا تنحرف وسائل النقل
الجديدة؛ وتوجد مصفوفة التغطية لكل مسار في
نظرة عامة على ضمان الجودة - تغطية النقل الحي.
يمثل qa-channel الحزمة الاصطناعية الواسعة وليس جزءًا من تلك المصفوفة.
بيانات اعتماد Telegram المشتركة عبر Convex (الإصدار 1)
عند تمكين --credential-source convex (أو OPENCLAW_QA_CREDENTIAL_SOURCE=convex)
لضمان جودة النقل الحي، يحصل مختبر ضمان الجودة على تأجير حصري من
مجموعة مدعومة بـ Convex، ويرسل Heartbeat لذلك التأجير أثناء تشغيل المسار،
ويحرر التأجير عند الإيقاف. يسبق اسم هذا القسم دعم Discord وSlack و
WhatsApp؛ فعقد التأجير مشترك بين الأنواع.
هيكل مشروع Convex المرجعي: qa/convex-credential-broker/
متغيرات البيئة المطلوبة:
OPENCLAW_QA_CONVEX_SITE_URL(على سبيل المثالhttps://your-deployment.convex.site)- سر واحد للدور المحدد:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERللدورmaintainerOPENCLAW_QA_CONVEX_SECRET_CIللدورci
- تحديد دور بيانات الاعتماد:
- CLI:
--credential-role maintainer|ci - القيمة الافتراضية من البيئة:
OPENCLAW_QA_CREDENTIAL_ROLE(القيمة الافتراضيةciفي CI، وmaintainerخلاف ذلك)
- CLI:
متغيرات البيئة الاختيارية:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(القيمة الافتراضية1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(القيمة الافتراضية30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(القيمة الافتراضية90000)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بعناوين URL لـ Convex تستخدم local loopback http://للتطوير المحلي فقط.
ينبغي أن يستخدم OPENCLAW_QA_CONVEX_SITE_URL البروتوكول https:// في التشغيل العادي.
تتطلب أوامر الإدارة الخاصة بالمشرفين (إضافة/إزالة/سرد المجموعة)
OPENCLAW_QA_CONVEX_SECRET_MAINTAINER تحديدًا.
أدوات CLI المساعدة للمشرفين:
pnpm openclaw qa credentials doctorpnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.jsonpnpm openclaw qa credentials list --kind telegrampnpm openclaw qa credentials remove --credential-id <credential-id>استخدم doctor قبل عمليات التشغيل الحية للتحقق من عنوان URL لموقع Convex وأسرار الوسيط
وبادئة نقطة النهاية ومهلة HTTP وإمكانية الوصول للإدارة/السرد من دون طباعة
قيم الأسرار. استخدم --json للحصول على مخرجات قابلة للقراءة آليًا في البرامج النصية وأدوات
CI.
عقد نقطة النهاية الافتراضي (OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1).
تصادق الطلبات باستخدام ترويسة Authorization: Bearer <role secret>؛
وتحذف الأجسام أدناه تلك الترويسة:
POST /acquire- الطلب:
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - النجاح:
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - مستنفد/قابل لإعادة المحاولة:
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- الطلب:
POST /payload-chunk- الطلب:
{ kind, ownerId, actorRole, credentialId, leaseToken, index } - النجاح:
{ status: "ok", index, data }
- الطلب:
POST /heartbeat- الطلب:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - النجاح:
{ status: "ok" }(أو2xxفارغ)
- الطلب:
POST /release- الطلب:
{ kind, ownerId, actorRole, credentialId, leaseToken } - النجاح:
{ status: "ok" }(أو2xxفارغ)
- الطلب:
POST /admin/add(سر المشرف فقط)- الطلب:
{ kind, actorId, payload, note?, status? } - النجاح:
{ status: "ok", credential }
- الطلب:
POST /admin/remove(سر المشرف فقط)- الطلب:
{ credentialId, actorId } - النجاح:
{ status: "ok", changed, credential } - حارس التأجير النشط:
{ status: "error", code: "LEASE_ACTIVE", ... }
- الطلب:
POST /admin/list(سر المشرف فقط)- الطلب:
{ kind?, status?, includePayload?, limit? } - النجاح:
{ status: "ok", credentials, count }
- الطلب:
بنية الحمولة لنوع Telegram:
{ groupId: string, driverToken: string, sutToken: string }- يجب أن يكون
groupIdسلسلة لمعرّف محادثة Telegram رقمي. - يتحقق
admin/addمن هذه البنية عندkind: "telegram"ويرفض الحمولات المشوهة.
بنية الحمولة لنوع المستخدم الحقيقي في Telegram:
{ groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }- يجب أن تكون
groupIdوtesterUserIdوtelegramApiIdسلاسل رقمية. - يجب أن تكون
tdlibArchiveSha256وdesktopTdataArchiveSha256سلاسل ست عشرية من نوع SHA-256. - يُحجز
kind: "telegram-user"لسير عمل إثبات Mantis لـ Telegram Desktop. يجب ألا تحصل عليه مسارات مختبر ضمان الجودة العامة.
حمولات القنوات المتعددة التي يتحقق منها الوسيط:
- Discord:
{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string, voiceChannelId?: string } - WhatsApp:
{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }
يمكن لمسارات Slack أيضًا الاستئجار من المجموعة، لكن التحقق من حمولة Slack
موجود حاليًا في مشغّل ضمان جودة Slack بدلًا من الوسيط. استخدم
{ channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }
لصفوف Slack.
إضافة قناة إلى ضمان الجودة
توجد أسماء البنية وأدوات السيناريو المساعدة لمهايئات القنوات الجديدة في
نظرة عامة على ضمان الجودة - إضافة قناة.
الحد الأدنى المطلوب: نفّذ مشغّل النقل على وصلة مضيف qa-lab المشتركة،
وأضف adapterFactory للسيناريوهات المشتركة، وصرّح عن qaRunners في
بيان Plugin، وثبّته بوصفه openclaw qa <runner>، وأنشئ السيناريوهات ضمن
qa/scenarios/.
حزم الاختبار (ما يُشغّل وأين)
فكّر في الحزم بوصفها «واقعية متزايدة» (مع زيادة عدم الاستقرار/التكلفة).
اختبارات الوحدة / التكامل (الافتراضية)
- الأمر:
pnpm test - الضبط: تستخدم عمليات التشغيل غير المستهدفة مجموعة الأجزاء
vitest.full-*.config.ts، وقد توسّع الأجزاء متعددة المشاريع إلى إعدادات منفصلة لكل مشروع للجدولة المتوازية - الملفات: قوائم اختبارات النواة/الوحدة ضمن
src/**/*.test.ts، وpackages/**/*.test.ts، وtest/**/*.test.ts؛ وتعمل اختبارات وحدة واجهة المستخدم في الجزء المخصصunit-ui - النطاق:
- اختبارات وحدة خالصة
- اختبارات تكامل داخل العملية (مصادقة Gateway، والتوجيه، والأدوات، والتحليل، والضبط)
- اختبارات انحدار حتمية للأخطاء المعروفة
- التوقعات:
- تعمل في CI
- لا تتطلب مفاتيح حقيقية
- ينبغي أن تكون سريعة ومستقرة
- يجب أن تثبت اختبارات المحلّل ومحمّل الأسطح العامة سلوك الرجوع الواسع لـ
api.jsوruntime-api.jsباستخدام تركيبات Plugin صغيرة مولّدة، لا واجهات API المصدرية الفعلية لملحقات Plugin المضمّنة. تنتمي عمليات تحميل API الفعلية لملحقات Plugin إلى حزم العقود/التكامل التي يملكها كل Plugin.
سياسة الاعتماديات الأصلية:
- تتخطى عمليات تثبيت الاختبار الافتراضية عمليات بناء opus الأصلية الاختيارية لـ Discord. يستخدم صوت Discord
الحزمة المضمّنة
libopus-wasm، وتظل@discordjs/opusمعطلة فيallowBuildsحتى لا تجمع الاختبارات المحلية ومسارات Testbox الإضافة الأصلية. - قارن أداء opus الأصلي في مستودع قياس أداء
libopus-wasm، وليس في حلقات التثبيت/الاختبار الافتراضية لـ OpenClaw. لا تعيّن@discordjs/opusإلىtrueفيallowBuildsالافتراضي؛ فهذا يجعل حلقات التثبيت/الاختبار غير المرتبطة تجمع شيفرة أصلية.
المشاريع والأجزاء والمسارات محددة النطاق
- تُشغِّل أوامر
pnpm testغير المستهدفة ثلاثة عشر إعدادًا مجزّأً أصغر (core-unit-fast، وcore-unit-src، وcore-unit-security، وcore-unit-ui، وcore-unit-support، وcore-support-boundary، وcore-tooling، و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 الحية، والأدوات، ثم يشغّل أوامر فحص الأنواع والتحليل الساكن والحراسة المطابقة. ولا يشغّل اختبارات Vitest؛ استخدمpnpm test:changedأوpnpm test <target>صراحةً لإثبات الاختبارات. تشغّل زيادات الإصدار التي تقتصر على البيانات الوصفية للإصدار فحوصات مستهدفة للإصدار/الإعداد/تبعيات الجذر، مع حارس يرفض تغييرات الحزم خارج حقل الإصدار ذي المستوى الأعلى. - تشغّل تعديلات حاضنة 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 شجرة الردود الفرعية أكثر إلى أجزاء لمشغّل الوكيل والتوزيع والأوامر/توجيه الحالة، كي لا تستحوذ مجموعة واحدة كثيفة الاستيراد على كامل الجزء المتأخر من Node. - يتخطى CI المعتاد لطلبات السحب/الفرع الرئيسي عمدًا المسح الدفعي للإضافات المضمّنة والجزء
agentic-pluginsالمخصص للإصدار فقط. ويطلق التحقق الكامل من الإصدار سير العمل الفرعي المنفصلPlugin Prereleaseلمجموعات الاختبارات كثيفة الإضافات هذه على الإصدارات المرشحة.
تغطية المشغّل المضمّن
- عند تغيير مدخلات اكتشاف أداة الرسائل أو سياق وقت تشغيل Compaction، احتفظ بمستويي التغطية.
- أضف اختبارات تراجع مركزة للمساعدات عند حدود التوجيه والتطبيع النقية.
- حافظ على سلامة مجموعات تكامل المشغّل المضمّن:
src/agents/embedded-agent-runner/compact.hooks.test.ts، وsrc/agents/embedded-agent-runner/run.overflow-compaction.test.ts، وsrc/agents/embedded-agent-runner/run.overflow-compaction.loop.test.ts. - تتحقق هذه المجموعات من استمرار تدفق المعرّفات محددة النطاق وسلوك Compaction
عبر مساري
run.ts/compact.tsالحقيقيين؛ ولا تُعد اختبارات المساعدات وحدها بديلًا كافيًا لمسارات التكامل هذه.
القيم الافتراضية لمجموعة Vitest والعزل
- يستخدم إعداد Vitest الأساسي
threadsافتراضيًا. - يثبت إعداد Vitest المشترك القيمة
isolate: falseويستخدم المشغّل غير المعزول عبر المشاريع الجذرية وإعدادات الاختبارات الشاملة والحية. - يحتفظ مسار واجهة المستخدم الجذري بتهيئة
jsdomوالمحسّن الخاصين به، لكنه يعمل أيضًا على المشغّل المشترك غير المعزول. - يرث كل جزء من
pnpm testالقيم الافتراضية نفسهاthreads+isolate: falseمن إعداد Vitest المشترك. - يضيف
scripts/run-vitest.mjsالخيار--no-maglevافتراضيًا إلى عمليات Node الفرعية لـ Vitest لتقليل تكرار ترجمة V8 أثناء عمليات التشغيل المحلية الكبيرة. اضبطOPENCLAW_VITEST_ENABLE_MAGLEV=1للمقارنة مع سلوك V8 القياسي. - ينهي
scripts/run-vitest.mjsعمليات Vitest الصريحة غير الخاضعة للمراقبة بعد 5 دقائق دون أي مخرجات على stdout أو stderr. اضبطOPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=0لتعطيل آلية المراقبة في تحقيق صامت عمدًا.
التكرار المحلي السريع
- يعرض
pnpm changed:lanesالمسارات المعمارية التي يؤدي الفرق إلى تشغيلها. - خطاف ما قبل الالتزام مخصص للتنسيق فقط. ويعيد إضافة الملفات المنسقة إلى منطقة التجهيز، ولا يشغّل التحليل الساكن أو فحص الأنواع أو الاختبارات.
- شغّل
pnpm check:changedصراحةً قبل التسليم أو الدفع عندما تحتاج إلى بوابة الفحص المحلية الذكية. - يوجّه
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لتحديد موقع تخزين مؤقت صريح واحد للتحليل المباشر للأداء.
تصحيح أخطاء الأداء
- يفعّل
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 <git-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 للمشغّل لمجموعة الوحدات مع تعطيل توازي الملفات.
الاستقرار (Gateway)
- الأمر:
pnpm test:stability:gateway - الإعداد:
test/vitest/vitest.gateway.config.tsوtest/vitest/vitest.logging.config.tsوtest/vitest/vitest.infra.config.ts، مع فرض عامل واحد لكل منها - النطاق:
- يبدأ Gateway حقيقيًا عبر local loopback مع تمكين التشخيصات افتراضيًا
- يمرّر تقلبات اصطناعية لرسائل Gateway والذاكرة والحمولات الكبيرة عبر مسار أحداث التشخيص
- يستعلم عن
diagnostics.stabilityعبر RPC الخاص بـ Gateway على WS - يغطي مساعدات استمرارية حزمة استقرار التشخيص
- يؤكد بقاء المسجّل ضمن الحدود، وبقاء عينات RSS الاصطناعية تحت ميزانية الضغط، وعودة أعماق الطوابير لكل جلسة إلى الصفر
- التوقعات:
- آمن لـ CI ولا يتطلب مفاتيح
- مسار ضيق لمتابعة حالات تراجع الاستقرار، وليس بديلًا عن مجموعة Gateway الكاملة
الاختبارات الشاملة (تجميع المستودع)
- الأمر:
pnpm test:e2e - النطاق:
- يشغّل مسار اختبار الدخان الشامل لـ Gateway
- يشغّل مسار المتصفح الشامل المحاكى لواجهة التحكم
- التوقعات:
- آمن لـ CI ولا يتطلب مفاتيح
- يتطلب تثبيت Playwright Chromium
الاختبارات الشاملة (اختبار دخان Gateway)
- الأمر:
pnpm test:e2e:gateway - الإعداد:
test/vitest/vitest.e2e.config.ts - الملفات:
src/**/*.e2e.test.tsوtest/**/*.e2e.test.tsواختبارات الإضافات المضمّنة الشاملة ضمنextensions/ - القيم الافتراضية لوقت التشغيل:
- يستخدم Vitest الخيار
threadsمعisolate: false، بما يتوافق مع بقية المستودع. - يستخدم عمالًا تكيفيين (CI: حتى 2، محليًا: 1 افتراضيًا).
- يعمل في الوضع الصامت افتراضيًا لتقليل تكلفة إدخال/إخراج وحدة التحكم.
- يستخدم Vitest الخيار
- التجاوزات المفيدة:
OPENCLAW_E2E_WORKERS=<n>لفرض عدد العمال (بحد أقصى 16).OPENCLAW_E2E_VERBOSE=1لإعادة تمكين مخرجات وحدة التحكم التفصيلية.
- النطاق:
- سلوك Gateway شامل متعدد المثيلات
- أسطح WebSocket/HTTP، وإقران Node، والشبكات الأثقل
- التوقعات:
- يعمل في CI (عند تمكينه في خط المعالجة)
- لا يتطلب مفاتيح حقيقية
- يحتوي على أجزاء متحركة أكثر من اختبارات الوحدات (وقد يكون أبطأ)
الاختبارات الشاملة (متصفح واجهة التحكم المحاكى)
- الأمر:
pnpm test:ui:e2e - الإعداد:
test/vitest/vitest.ui-e2e.config.ts - الملفات:
ui/src/**/*.e2e.test.ts - النطاق:
- يبدأ واجهة التحكم في Vite
- يقود صفحة Chromium حقيقية عبر Playwright
- يستبدل WebSocket الخاص بـ Gateway بمحاكيات حتمية داخل المتصفح
- التوقعات:
- يعمل في CI كجزء من
pnpm test:e2e - لا يتطلب Gateway حقيقيًا أو وكلاء أو مفاتيح مزودين
- يجب أن تكون تبعية المتصفح موجودة (
pnpm --dir ui exec playwright install chromium)
- يعمل في CI كجزء من
الاختبارات الشاملة: اختبار دخان الواجهة الخلفية لـ OpenShell
- الأمر:
pnpm test:e2e:openshell - الملف:
extensions/openshell/src/backend.e2e.test.ts - النطاق:
- يعيد استخدام Gateway محلي نشط لـ OpenShell
- ينشئ بيئة معزولة من Dockerfile محلي مؤقت
- يختبر الواجهة الخلفية لـ OpenShell في OpenClaw عبر
sandbox ssh-configحقيقي + تنفيذ SSH - يتحقق من سلوك نظام الملفات المرجعي البعيد عبر جسر نظام ملفات البيئة المعزولة
- التوقعات:
- اختياري فقط؛ وليس جزءًا من تشغيل
pnpm test:e2eالافتراضي - يتطلب CLI محليًا لـ
openshellوعفريت Docker عاملًا - يتطلب Gateway محليًا نشطًا لـ OpenShell ومصدر إعداده
- يستخدم
HOME/XDG_CONFIG_HOMEمعزولين، ثم يدمر بيئة الاختبار المعزولة
- اختياري فقط؛ وليس جزءًا من تشغيل
- التجاوزات المفيدة:
OPENCLAW_E2E_OPENSHELL=1لتمكين الاختبار عند تشغيل مجموعة الاختبارات الشاملة الأوسع يدويًاOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshellللإشارة إلى ملف CLI تنفيذي غير افتراضي أو نص تغليفOPENCLAW_E2E_OPENSHELL_CONFIG_HOME=/path/to/configلإتاحة إعداد Gateway المسجل للاختبار المعزولOPENCLAW_E2E_OPENSHELL_HOST_IP=172.18.0.1لتجاوز عنوان IP الخاص بـ Gateway في Docker والمستخدم من مثبّت سياسة المضيف
مباشر (مزودون حقيقيون + نماذج حقيقية)
- الأمر:
pnpm test:live - الإعداد:
test/vitest/vitest.live.config.ts - الملفات:
src/**/*.live.test.tsوtest/**/*.live.test.tsواختبارات Plugin الحية المضمّنة ضمنextensions/ - الإعداد الافتراضي: مفعّل بواسطة
pnpm test:live(يضبطOPENCLAW_LIVE_TEST=1) - النطاق:
- "هل يعمل هذا المزوّد/النموذج فعليًا اليوم باستخدام بيانات اعتماد حقيقية؟"
- اكتشاف تغييرات تنسيق المزوّد، وخصوصيات استدعاء الأدوات، ومشكلات المصادقة، وسلوك حدود المعدّل
- التوقعات:
- غير مصمم ليكون مستقرًا في CI (شبكات حقيقية، وسياسات مزوّدين حقيقية، وحصص، وانقطاعات)
- يكلّف مالًا / يستهلك حدود المعدّل
- يُفضّل تشغيل مجموعات فرعية محددة بدلًا من "كل شيء"
- تستخدم عمليات التشغيل الحية مفاتيح API المصدّرة مسبقًا وملفات تعريف المصادقة المرحّلية.
- افتراضيًا، تظل عمليات التشغيل الحية تعزل
HOMEوتنسخ مواد الإعداد/المصادقة إلى مجلد منزل مؤقت للاختبار، كي لا تتمكن تجهيزات اختبارات الوحدات من تعديل~/.openclawالحقيقي لديك. - اضبط
OPENCLAW_LIVE_USE_REAL_HOME=1فقط عندما تحتاج عمدًا إلى أن تستخدم الاختبارات الحية مجلد المنزل الحقيقي لديك. - يستخدم
pnpm test:liveافتراضيًا وضعًا أكثر هدوءًا: فهو يُبقي مخرجات التقدم[live] ...ويكتم سجلات تمهيد 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 هادئًا.
- يعطّل
test/vitest/vitest.live.config.tsاعتراض وحدة التحكم في Vitest، بحيث تتدفق أسطر تقدم المزوّد/Gateway فورًا أثناء عمليات التشغيل الحية. - اضبط Heartbeat للنموذج المباشر باستخدام
OPENCLAW_LIVE_HEARTBEAT_MS. - اضبط Heartbeat لـ Gateway/الاستقصاء باستخدام
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
أي مجموعة اختبارات ينبغي أن أشغّل؟
استخدم جدول القرار هذا:
- عند تعديل المنطق/الاختبارات: شغّل
pnpm test(وكذلكpnpm test:coverageإذا غيّرت الكثير) - عند تعديل شبكة Gateway / بروتوكول WS / الاقتران: أضف
pnpm test:e2e - عند تصحيح "الروبوت لدي متوقف" / الأعطال الخاصة بمزوّد / استدعاء الأدوات: شغّل نطاقًا محددًا من
pnpm test:live
الاختبارات الحية (التي تتصل بالشبكة)
للحصول على مصفوفة النماذج الحية، واختبارات الدخان للواجهة الخلفية لـ CLI، واختبارات الدخان لـ ACP، وحاضنة خادم تطبيق Codex، وجميع اختبارات مزوّدي الوسائط الحية (Deepgram وBytePlus وComfyUI والصور والموسيقى والفيديو وحاضنة الوسائط)، بالإضافة إلى معالجة بيانات الاعتماد لعمليات التشغيل الحية
- راجع اختبار مجموعات الاختبارات الحية. وللاطلاع على قائمة التحقق المخصصة لتحديث Plugin والتحقق منه، راجع اختبار التحديثات وPlugin.
مشغّلات 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)، مع وصل مجلد الإعداد المحلي ومساحة العمل وملف بيئة اختياري لملف التعريف. نقطتا الدخول المحليتان المطابقتان هماtest:live:models-profilesوtest:live:gateway-profiles. - تحتفظ مشغّلات Docker الحية بحدودها العملية الخاصة عند الحاجة:
يستخدم
test:docker:live-modelsافتراضيًا المجموعة المنتقاة المدعومة ذات الدلالة العالية، ويستخدم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. اضبطOPENCLAW_LIVE_MAX_MODELSأو متغيرات بيئة Gateway عندما تريد صراحةً حدًا أصغر أو فحصًا أوسع. - يبني
test:docker:allصورة Docker الحية مرة واحدة عبرtest:docker:live-build، ويحزم OpenClaw مرة واحدة كحزمة npm مضغوطة عبر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في خانات العمليات، بينما تمنع حدود الموارد المسارات الحية الثقيلة ومسارات تثبيت npm والمسارات متعددة الخدمات من البدء جميعًا في الوقت نفسه. إذا كان مسار واحد أثقل من الحدود النشطة، فلا يزال بإمكان المجدول بدء تشغيله عندما يكون المجمّع فارغًا، ثم يُبقيه قيد التشغيل منفردًا حتى تتوفر السعة مجددًا. القيم الافتراضية هي 10 خانات، وOPENCLAW_DOCKER_ALL_LIVE_LIMIT=9، وOPENCLAW_DOCKER_ALL_NPM_LIMIT=5، وOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7؛ لا تضبطOPENCLAW_DOCKER_ALL_WEIGHT_LIMITأوOPENCLAW_DOCKER_ALL_DOCKER_LIMIT(وتجاوزاتOPENCLAW_DOCKER_ALL_<RESOURCE>_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=trusted-urlأوsource=artifact، وترفعها باسمpackage-under-test، ثم تشغّل مسارات Docker E2E القابلة لإعادة الاستخدام على تلك الحزمة المضغوطة نفسها بدلًا من إعادة حزم المرجع المحدد. تُرتب ملفات التعريف حسب الاتساع:smokeوpackageوproductوfull(بالإضافة إلىcustomلقائمة مسارات صريحة). راجع اختبار التحديثات وPlugin للاطلاع على عقد الحزمة/التحديث/Plugin، ومصفوفة بقاء الترقية المنشورة، وإعدادات الإصدار الافتراضية، وفرز الأعطال.- تشغّل فحوص البناء والإصدار
scripts/check-cli-bootstrap-imports.mjsبعد tsdown. يتتبع الحارس الرسم البياني الثابت المبني بدءًا منdist/entry.jsوdist/cli/run-main.js، ويفشل إذا استورد رسم التمهيد السابق لتوجيه الأوامر أي حزمة خارجية استيرادًا ثابتًا (تُحتسب Commander وواجهة المطالبات وundici والتسجيل والتبعيات الثقيلة المشابهة عند بدء التشغيل جميعها) قبل توجيه الأمر؛ كما يحد حجم مقطع تشغيل Gateway المضمّن عند 70 كيلوبايت، ويرفض الاستيرادات الثابتة لمسارات Gateway الباردة المعروفة (control-ui-assetsوdiagnostic-stability-bundleوonboard-helpersوprocess-respawnوrestart-sentinelوserver-closeوserver-reload-handlers) من ذلك المقطع. يختبرscripts/release-check.tsبشكل منفصل حزمة CLI المضغوطة باختبارات دخان باستخدام--helpوonboard --helpوdoctor --helpوstatus --json --timeout 1وconfig schemaوmodels list --provider openai. - يقتصر توافق
Package Acceptanceمع الإصدارات القديمة على2026.4.25(بما في ذلك2026.4.25-beta.*). وحتى ذلك الحد، لا تتسامح الحاضنة إلا مع فجوات بيانات التعريف في الحزم المنشورة: إدخالات مخزون QA الخاصة المحذوفة، وغيابgateway install --wrapper، وغياب ملفات الرقع في تجهيز Git المشتق من الحزمة المضغوطة، وغيابupdate.channelالمستمر، والمواقع القديمة لسجلات تثبيت Plugin، وغياب استمرارية سجل تثبيت السوق، وترحيل بيانات تعريف الإعداد أثناءplugins update. بالنسبة إلى الحزم اللاحقة لـ2026.4.25، تُعد هذه المسارات حالات فشل صارمة. - مشغّلات دخان الحاويات: تشغّل
test:docker:openwebuiوtest:docker:onboardوtest:docker:npm-onboard-channel-agentوtest:docker:release-user-journeyوtest:docker:release-typed-onboardingوtest:docker:release-media-memoryوtest:docker:release-upgrade-user-journeyوtest:docker:release-plugin-marketplaceوtest:docker:skill-installوtest:docker:update-channel-switchوtest:docker:upgrade-survivorوtest:docker:published-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:agent-bundle-mcp-toolsوtest:docker:cron-mcp-cleanupوtest:docker:pluginsوtest:docker:plugin-updateوtest:docker:plugin-lifecycle-matrixوtest:docker:config-reloadحاوية حقيقية واحدة أو أكثر، وتتحقق من مسارات التكامل عالية المستوى. - تضع مسارات Docker/Bash E2E التي تثبّت حزمة OpenClaw المضغوطة عبر
scripts/lib/openclaw-e2e-instance.shحدًا زمنيًا لأمرnpm installباستخدامOPENCLAW_E2E_NPM_INSTALL_TIMEOUT(القيمة الافتراضية600s؛ اضبطها على0لتعطيل الغلاف لأغراض تصحيح الأخطاء).
تصل مشغّلات 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) -
Gateway + وكيل التطوير:
pnpm test:docker:live-gateway(البرنامج النصي:scripts/test-live-gateway-models-docker.sh) -
اختبارات دخان قابلية الرصد:
pnpm qa:otel:smokeوpnpm qa:prometheus:smokeوpnpm qa:observability:smokeهي مسارات خاصة لـ QA في نسخة مصدرية. وهي ليست جزءًا من مسارات إصدار حزم Docker عمدًا، لأن حزمة npm المضغوطة تستبعد مختبر QA. -
اختبار الدخان الحي لـ 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، ثم يشغّل دورة واحدة لوكيل OpenAI وهمي. أعد استخدام حزمة مضغوطة مبنية مسبقًا باستخدامOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz، أو تخطَّ إعادة البناء على المضيف باستخدامOPENCLAW_NPM_ONBOARD_HOST_BUILD=0، أو بدّل القناة باستخدامOPENCLAW_NPM_ONBOARD_CHANNEL=discordأوOPENCLAW_NPM_ONBOARD_CHANNEL=slack. -
اختبار دخاني لرحلة مستخدم الإصدار: يثبّت
pnpm test:docker:release-user-journeyحزمة tarball المجمّعة لـ OpenClaw عموميًا في مجلد Docker رئيسي نظيف، ويشغّل الإعداد الأولي، ويضبط موفّر OpenAI محاكى، وينفّذ دورة وكيل، ويثبّت المكوّنات الإضافية الخارجية ويلغي تثبيتها، ويضبط ClickClack مقابل تركيبة اختبار محلية، ويتحقق من المراسلة الصادرة والواردة، ويعيد تشغيل Gateway، ويشغّل doctor. -
اختبار دخاني للإعداد الأولي ذي الأنواع في الإصدار: يثبّت
pnpm test:docker:release-typed-onboardingحزمة tarball المجمّعة، ويديرopenclaw onboardعبر TTY حقيقي، ويضبط OpenAI كموفّر مرجعي لمتغير بيئة، ويتحقق من عدم تخزين المفتاح الخام بصورة دائمة، وينفّذ دورة وكيل محاكاة. -
اختبار دخاني للوسائط/الذاكرة في الإصدار: يثبّت
pnpm test:docker:release-media-memoryحزمة tarball المجمّعة، ويتحقق من فهم الصور من مرفق PNG، ومخرجات توليد الصور المتوافقة مع OpenAI، واسترجاع البحث في الذاكرة، واستمرار الاسترجاع بعد إعادة تشغيل Gateway. -
اختبار دخاني لرحلة مستخدم ترقية الإصدار: يثبّت
pnpm test:docker:release-upgrade-user-journeyافتراضيًا أحدث خط أساس منشور أقدم من حزمة tarball المرشحة، ويضبط حالة الموفّر/المكوّن الإضافي/ClickClack على الحزمة المنشورة، ويرقّي إلى حزمة tarball المرشحة، ثم يعيد تشغيل رحلة الوكيل/المكوّن الإضافي/القناة الأساسية. إذا لم يوجد خط أساس منشور أقدم، فإنه يعيد استخدام إصدار المرشح. تجاوز خط الأساس باستخدامOPENCLAW_RELEASE_UPGRADE_BASELINE_SPEC=openclaw@<version>. -
اختبار دخاني لسوق المكوّنات الإضافية في الإصدار: يثبّت
pnpm test:docker:release-plugin-marketplaceمن سوق تركيبات اختبار محلي، ويحدّث المكوّن الإضافي المثبّت، ويلغي تثبيته، ويتحقق من اختفاء CLI الخاص بالمكوّن الإضافي مع إزالة بيانات التثبيت الوصفية. -
اختبار دخاني لتثبيت المهارة: يثبّت
pnpm test:docker:skill-installحزمة tarball المجمّعة لـ OpenClaw عموميًا في Docker، ويعطّل عمليات تثبيت الأرشيفات المرفوعة في الإعدادات، ويستخرج المعرّف النصي الحالي للمهارة الحية في ClawHub من البحث، ويثبّتها باستخدامopenclaw skills install، ويتحقق من المهارة المثبّتة وبيانات المنشأ/القفل الوصفية في.clawhub. -
اختبار دخاني لتبديل قناة التحديث: يثبّت
pnpm test:docker:update-channel-switchحزمة tarball المجمّعة لـ OpenClaw عموميًا في Docker، وينتقل من حزمةstableإلى gitdev، ويتحقق من عمل القناة المحفوظة والمكوّن الإضافي بعد التحديث، ثم يعود إلى حزمةstableويفحص حالة التحديث. -
اختبار دخاني لاجتياز الترقية: يثبّت
pnpm test:docker:upgrade-survivorحزمة tarball المجمّعة لـ OpenClaw فوق تركيبة اختبار متّسخة لمستخدم قديم تحتوي على وكلاء، وإعدادات قناة، وقوائم سماح للمكوّنات الإضافية، وحالة قديمة لاعتماديات المكوّنات الإضافية، وملفات مساحة عمل/جلسة موجودة. ويشغّل تحديث الحزمة مع doctor غير تفاعلي دون مفاتيح حية للموفّر أو القناة، ثم يبدأ Gateway على local loopback ويفحص الحفاظ على الإعدادات/الحالة وميزانيات بدء التشغيل/الحالة. -
اختبار دخاني منشور لاجتياز الترقية: يثبّت
pnpm test:docker:published-upgrade-survivorافتراضيًاopenclaw@latest، ويملأ ملفات واقعية لمستخدم موجود، ويضبط خط الأساس هذا باستخدام وصفة أوامر مضمنة، ويتحقق من الإعدادات الناتجة، ويحدّث التثبيت المنشور إلى حزمة tarball المرشحة، ويشغّل doctor غير تفاعلي، ويكتب.artifacts/upgrade-survivor/summary.json، ثم يبدأ Gateway على local loopback ويفحص المقاصد المضبوطة، والحفاظ على الحالة، وبدء التشغيل، و/healthz، و/readyz، وميزانيات حالة RPC. تجاوز خط أساس واحد باستخدامOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC، أو اطلب من المجدول التجميعي توسيع خطوط الأساس المحلية الدقيقة باستخدامOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECSمثلopenclaw@2026.5.2 openclaw@2026.4.23 openclaw@2026.4.15، ووسّع تركيبات الاختبار المصاغة على هيئة مشكلات باستخدامOPENCLAW_UPGRADE_SURVIVOR_SCENARIOSمثلreported-issues؛ وتتضمن مجموعة المشكلات المبلّغ عنهاconfigured-plugin-installsللإصلاح التلقائي لتثبيت مكوّنات OpenClaw الإضافية الخارجية. يتيح اختبار قبول الحزمة هذه القيم باسمpublished_upgrade_survivor_baselineوpublished_upgrade_survivor_baselinesوpublished_upgrade_survivor_scenarios، ويحل رموز خطوط الأساس الوصفية مثلlast-stable-4أوall-since-2026.4.23، ويوسّع التحقق الكامل من الإصدار بوابة حزمة اختبار تحمّل الإصدار إلىlast-stable-4 2026.4.23 2026.5.2 2026.4.15بالإضافة إلىreported-issues. -
اختبار دخاني لسياق وقت تشغيل الجلسة: يتحقق
pnpm test:docker:session-runtime-contextمن التخزين الدائم لنص سياق وقت التشغيل المخفي، بالإضافة إلى إصلاح doctor لفروع إعادة كتابة المطالبات المكررة المتأثرة. -
اختبار دخاني للتثبيت العمومي باستخدام Bun: يحزم
bash scripts/e2e/bun-global-install-smoke.shالشجرة الحالية، ويثبّتها باستخدامbun install -gفي مجلد رئيسي معزول، ويتحقق من أن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 بين حاويات المستخدم الجذر والتحديث والتثبيت المباشر عبر npm. يستخدم اختبار التحديث الدخاني افتراضيًا إصدار npmlatestكخط أساس مستقر قبل الترقية إلى حزمة tarball المرشحة. تجاوزه محليًا باستخدامOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22، أو باستخدام مُدخلupdate_baseline_versionلسير عمل اختبار التثبيت الدخاني على GitHub. تحتفظ فحوصات أداة التثبيت لغير المستخدم الجذر بذاكرة تخزين مؤقت معزولة لـ npm كي لا تحجب إدخالات الذاكرة المملوكة للمستخدم الجذر سلوك التثبيت المحلي للمستخدم. اضبطOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cacheلإعادة استخدام ذاكرة التخزين المؤقت الخاصة بالمستخدم الجذر/التحديث/التثبيت المباشر عبر npm بين عمليات إعادة التشغيل المحلية. -
يتخطى CI لاختبار التثبيت الدخاني تحديث التثبيت العمومي المباشر المكرر عبر 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 صالح ومن سلوك الاحتفاظ بمساحة العمل. أعد استخدام صورة اختبار التثبيت الدخاني باستخدامOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1. -
شبكات Gateway ودورة حياة المضيف: يحافظ
pnpm test:docker:gateway-network(البرنامج النصي:scripts/e2e/gateway-network-docker.sh) على الاختبار الدخاني للمصادقة/السلامة عبر WebSocket في شبكة LAN بحاويتين، ثم يستخدم HTTP إداريًا عبر local loopback لإثبات تسييج التحضير، والوصول إلى التحكم المحتفظ به، والاستعادة عبر الاستئناف، وعملية إيقاف/تشغيل محضّرة داخل الحاوية نفسها. يجب أن ينتهي فحص إعادة التشغيل قبل انتهاء عقد الإيجار الأصلي، ويتحقق من أن حالة التعليق محلية للعملية بينما تبقى إعدادات Gateway المحفوظة وهوية الحاوية، ويصدر JSON قابلًا للمعالجة آليًا لتوقيت المراحل. -
اختبار دخاني للقطات 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 لحزمة OpenClaw (خادم MCP حقيقي عبر stdio + اختبار دخاني مضمن للسماح/الرفض في ملف تعريف OpenClaw):
pnpm test:docker:agent-bundle-mcp-tools(البرنامج النصي:scripts/e2e/agent-bundle-mcp-tools-docker.sh) -
تنظيف MCP لـ Cron/الوكيل الفرعي (Gateway حقيقي + إنهاء عملية MCP فرعية عبر stdio بعد عمليات Cron معزولة وتشغيل وكيل فرعي لمرة واحدة):
pnpm test:docker:cron-mcp-cleanup(البرنامج النصي:scripts/e2e/cron-mcp-cleanup-docker.sh) -
المكوّنات الإضافية (اختبار دخاني للتثبيت/التحديث لمسار محلي، و
file:، وسجل npm ذي الاعتماديات المرفوعة، وبيانات وصفية مشوّهة لحزمة npm، ومراجع git المتحركة، وتركيبة 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. -
اختبار دخاني لعدم تغيّر تحديث المكوّن الإضافي:
pnpm test:docker:plugin-update(البرنامج النصي:scripts/e2e/plugin-update-unchanged-docker.sh) -
اختبار دخاني لمصفوفة دورة حياة المكوّن الإضافي: يثبّت
pnpm test:docker:plugin-lifecycle-matrixحزمة tarball المجمّعة لـ OpenClaw في حاوية مجردة، ويثبّت مكوّنًا إضافيًا من npm، ويبدّل بين التمكين والتعطيل، ويرقّيه ويخفض إصداره عبر سجل npm محلي، ويحذف الشفرة المثبّتة، ثم يتحقق من أن إلغاء التثبيت لا يزال يزيل الحالة القديمة مع تسجيل مقاييس RSS/CPU لكل مرحلة من دورة الحياة. -
اختبار دخاني للبيانات الوصفية لإعادة تحميل الإعدادات:
pnpm test:docker:config-reload(البرنامج النصي:scripts/e2e/config-reload-source-docker.sh) -
المكوّنات الإضافية: يغطي
pnpm test:docker:pluginsاختبار التثبيت/التحديث الدخاني لمسار محلي، وfile:، وسجل npm ذي الاعتماديات المرفوعة، ومراجع git المتحركة، وتركيبات ClawHub، وتحديثات السوق، وتمكين/فحص حزمة Claude. يغطيpnpm test:docker:plugin-updateسلوك التحديث دون تغييرات للمكوّنات الإضافية المثبّتة. يغطيpnpm test:docker:plugin-lifecycle-matrixتثبيت مكوّن npm الإضافي وتمكينه وتعطيله وترقيته وخفض إصداره وإلغاء تثبيته عند فقدان الشفرة، مع تتبع الموارد.
لبناء الصورة الوظيفية المشتركة مسبقًا وإعادة استخدامها يدويًا:
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-buildOPENCLAW_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 إلى صورة مشتركة بعيدة، تسحبها البرامج النصية إذا لم تكن موجودة محليًا بالفعل. تحتفظ اختبارات QR وأداة التثبيت في Docker بملفات Dockerfile الخاصة بها لأنها تتحقق من سلوك الحزمة/التثبيت بدلًا من وقت تشغيل التطبيق المبني المشترك.
كما يربط مشغّلو Docker للنماذج الحية نسخة العمل الحالية بوضع القراءة فقط
ويجهّزونها في دليل عمل مؤقت داخل الحاوية. يُبقي هذا
صورة وقت التشغيل صغيرة مع الاستمرار في تشغيل 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. اضبط
OPENWEBUI_SMOKE_MODE=models لعمليات تحقق CI الخاصة بمسار الإصدار التي ينبغي أن تتوقف
بعد تسجيل الدخول إلى Open WebUI واكتشاف النموذج، دون انتظار اكتمال استجابة
من نموذج فعلي. قد يكون التشغيل الأول أبطأ بشكل ملحوظ لأن Docker قد يحتاج إلى
سحب صورة Open WebUI، وقد يحتاج Open WebUI إلى إكمال إعداد
البدء البارد الخاص به. يتوقع هذا المسار مفتاح نموذج فعلي صالحًا للاستخدام، يُوفَّر عبر
بيئة العملية، أو ملفات تعريف مصادقة مجهّزة مسبقًا، أو
OPENCLAW_PROFILE_FILE صريح. تطبع عمليات التشغيل الناجحة حمولة JSON صغيرة مثل
{ "ok": true, "model": "openclaw/default", ... }.
صُمِّم test:docker:mcp-channels ليكون حتميًا ولا يحتاج إلى
حساب Telegram أو Discord أو iMessage حقيقي. فهو يشغّل حاوية Gateway
مزودة ببيانات أولية، ثم يشغّل حاوية ثانية تُنشئ العملية openclaw mcp serve، وبعد ذلك
يتحقق من اكتشاف المحادثات الموجّهة، وقراءة النصوص المنسوخة للمحادثات، وبيانات
المرفقات الوصفية، وسلوك قائمة انتظار الأحداث المباشرة، وتوجيه الإرسال الصادر، وإشعارات
القنوات والأذونات بأسلوب Claude عبر جسر MCP الفعلي المستند إلى stdio. يفحص
اختبار الإشعارات إطارات MCP الخام عبر stdio مباشرةً، بحيث يتحقق الاختبار التمهيدي
مما يصدره الجسر فعليًا، وليس فقط مما تعرضه مصادفةً حزمة SDK
لعميل محدد.
test:docker:agent-bundle-mcp-tools حتمي ولا يحتاج إلى
مفتاح نموذج فعلي. فهو يبني صورة Docker للمستودع، ويشغّل خادم فحص MCP فعليًا عبر stdio
داخل الحاوية، ويُنشئ ذلك الخادم من خلال بيئة تشغيل MCP المضمّنة في حزمة
OpenClaw، وينفّذ الأداة، ثم يتحقق من أن
coding وmessaging يحتفظان بأدوات bundle-mcp، بينما يقوم minimal و
tools.deny: ["bundle-mcp"] بتصفيتها.
test:docker:cron-mcp-cleanup حتمي ولا يحتاج إلى مفتاح
نموذج فعلي. فهو يشغّل Gateway مزودًا ببيانات أولية مع خادم فحص MCP فعلي عبر stdio،
وينفّذ دورة Cron معزولة ودورة فرعية أحادية التنفيذ عبر sessions_spawn، ثم
يتحقق من خروج العملية الفرعية لـ MCP بعد كل تشغيل.
اختبار تمهيدي يدوي لسلسلة ACP باللغة الطبيعية (ليس ضمن CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- احتفظ بهذا البرنامج النصي لسير عمل الانحدار/تصحيح الأخطاء. قد تكون هناك حاجة إليه مجددًا للتحقق من توجيه سلاسل ACP، لذا لا تحذفه.
متغيرات بيئة مفيدة:
OPENCLAW_CONFIG_DIR=...(الافتراضي:~/.openclaw) يُركَّب في/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(الافتراضي:~/.openclaw/workspace) يُركَّب في/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...يُركَّب ويُحمَّل قبل تشغيل الاختباراتOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1للتحقق فقط من متغيرات البيئة المحمّلة منOPENCLAW_PROFILE_FILE، باستخدام أدلة مؤقتة للإعدادات/مساحة العمل ومن دون تركيبات مصادقة CLI خارجيةOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(الافتراضي:~/.cache/openclaw/docker-cli-tools، ما لم يكن التشغيل يستخدم بالفعل دليل ربط مُدارًا/خاصًا بـ CI) يُركَّب في/home/node/.npm-globalلعمليات تثبيت CLI المخزنة مؤقتًا داخل Docker- تُركَّب أدلة/ملفات مصادقة CLI الخارجية ضمن
$HOMEبوضع القراءة فقط تحت/host-auth...، ثم تُنسخ إلى/home/node/...قبل بدء الاختبارات- الأدلة الافتراضية (تُستخدم عندما لا يكون التشغيل محصورًا في مزودين محددين):
.factory،.gemini،.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_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...لحصر التشغيل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=...لتجاوز موجّه التحقق من القيمة الفريدة المستخدم في اختبار Open WebUI التمهيديOPENWEBUI_IMAGE=...لتجاوز وسم صورة Open WebUI المثبّت
التحقق من سلامة الوثائق
شغّل فحوصات الوثائق بعد تعديلها: 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")
تقييمات موثوقية الوكيل (Skills)
لدينا بالفعل بضعة اختبارات آمنة لـ CI تتصرف مثل «تقييمات موثوقية الوكيل»:
- استدعاء أدوات محاكى عبر Gateway الفعلي + حلقة الوكيل (
src/gateway/gateway.test.ts). - تدفقات معالج إعداد شاملة تتحقق من ربط الجلسة وتأثيرات الإعدادات (
src/gateway/gateway.test.ts).
ما لا يزال مفقودًا لـ Skills (راجع Skills):
- اتخاذ القرار: عندما تُدرج Skills في الموجّه، هل يختار الوكيل Skill الصحيحة (أو يتجنب غير ذات الصلة)؟
- الامتثال: هل يقرأ الوكيل
SKILL.mdقبل الاستخدام ويتبع الخطوات/الوسائط المطلوبة؟ - عقود سير العمل: سيناريوهات متعددة الدورات تتحقق من ترتيب الأدوات، واستمرار سجل الجلسة، وحدود بيئة العزل.
ينبغي أن تظل التقييمات المستقبلية حتمية أولًا:
- مشغّل سيناريوهات يستخدم مزودين محاكيين للتحقق من استدعاءات الأدوات وترتيبها، وقراءة ملفات Skills، وربط الجلسة.
- مجموعة صغيرة من السيناريوهات التي تركز على Skills (الاستخدام مقابل التجنب، والبوابات، وحقن الموجّهات).
- تقييمات فعلية اختيارية (اشتراك اختياري، ومقيّدة بمتغيرات البيئة) فقط بعد تجهيز المجموعة الآمنة لـ CI.
اختبارات العقود (بنية Plugin والقناة)
تتحقق اختبارات العقود من أن كل Plugin وقناة مسجلين يتوافقان مع
عقد الواجهة الخاص بهما. وهي تمر على جميع Plugins المكتشفة وتشغّل
مجموعة من تأكيدات البنية والسلوك. يتخطى مسار الوحدات الافتراضي pnpm test
عمدًا ملفات نقاط الالتقاء المشتركة والاختبارات التمهيدية هذه؛ شغّل أوامر العقود
صراحةً عند تعديل أسطح القنوات أو المزودين المشتركة.
الأوامر
- جميع العقود:
pnpm test:contracts - عقود القنوات فقط:
pnpm test:contracts:channels - عقود المزودين فقط:
pnpm test:contracts:plugins
عقود القنوات
توجد في src/channels/plugins/contracts/*.contract.test.ts. الفئات
العليا الحالية:
- دليل القنوات - البيانات الوصفية لإدخالات دليل القنوات المضمّنة/المستندة إلى السجل
- Plugin (مستند إلى السجل، ومقسّم إلى أجزاء) - البنية الأساسية لتسجيل Plugin
- الأسطح فقط (مستند إلى السجل، ومقسّم إلى أجزاء) - فحوصات البنية لكل سطح من
actionsوsetupوstatusوoutboundوmessagingوthreadingوdirectoryوgateway - ربط الجلسة (مستند إلى السجل) - سلوك ربط الجلسة
- حمولة الإرسال الصادر - بنية حمولة الرسالة وتسويتها
- سياسة المجموعة (احتياطية) - فرض سياسة المجموعة الافتراضية لكل قناة
- سلاسل المحادثات (مستند إلى السجل، ومقسّم إلى أجزاء) - معالجة معرّفات سلاسل المحادثات
- الدليل (مستند إلى السجل، ومقسّم إلى أجزاء) - واجهة API للدليل/قائمة الأعضاء
- السجل والنواة الخاصة بـ Plugins.* - سجل Plugins للقنوات، والمحمّل، والتفاصيل الداخلية لتفويض كتابة الإعدادات
تُعرض داخليًا أدوات مساعدة لحافظة التقاط الإرسال الوارد وحمولة الإرسال الصادر التي تستخدمها هذه
المجموعات عبر src/plugin-sdk/channel-contract-testing.ts
(مستبعد من npm، وليس مسارًا فرعيًا عامًا لـ SDK)؛ ولا يوجد ملف مستقل باسم
inbound.contract.test.ts في هذا الدليل.
عقود المزودين
توجد في src/plugins/contracts/*.contract.test.ts. تشمل الفئات الحالية:
- البنية - بيان Plugin، وواجهة API، وبنية صادرات بيئة التشغيل
- تسجيل Plugin (+ متوازٍ) - حالات تسجيل البيان
- بيان الحزمة - متطلبات بيان الحزمة
- المحمّل - سلوك إعداد/تفكيك محمّل Plugin
- السجل - محتويات سجل عقود Plugins والبحث فيه
- المزودون - سلوك المزود المشترك عبر المزودين المضمّنين، بالإضافة إلى مزودي البحث على الويب
- اختيار المصادقة - البيانات الوصفية لاختيار المصادقة وسلوك الإعداد
- إهمال دليل المزودين - البيانات الوصفية لدليل المزودين المهملين
- حل اختيار معالج الإعداد، منتقي نموذج معالج الإعداد، خيارات إعداد معالج الإعداد - عقود معالج إعداد المزود
- مزود التضمين، مزود تضمين الذاكرة، مزود جلب الويب، تحويل النص إلى كلام - عقود المزود الخاصة بالقدرات
- إجراءات الجلسة، مرفقات الجلسة، إسقاط إدخال الجلسة - عقود حالة الجلسة المملوكة لـ Plugin
- الدورات المجدولة - البيانات الوصفية لدورات Plugin المجدولة وحدود الطابع الزمني
- خطافات المضيف، دورة حياة سياق التشغيل، الآثار الجانبية لاستيراد بيئة التشغيل، نقاط التقاء بيئة التشغيل - عقود دورة حياة مضيف/بيئة تشغيل Plugin وحدود الاستيراد
- تبعيات بيئة تشغيل الامتدادات - موضع تبعيات بيئة التشغيل للامتدادات
متى تُشغَّل
- بعد تغيير صادرات أو مسارات Plugin SDK الفرعية
- بعد إضافة أو تعديل Plugin لقناة أو مزود
- بعد إعادة هيكلة تسجيل Plugins أو اكتشافها
تعمل اختبارات العقود ضمن 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في ذلك الاختبار. يفشل الاختبار عمدًا عند وجود معرّفات أهداف غير مصنفة، حتى لا يمكن تخطي الفئات الجديدة بصمت.
- يستخرج