Testing
آزمایش
OpenClaw دارای سه مجموعهٔ Vitest (واحد/یکپارچهسازی، e2e، زنده) بهعلاوهٔ اجراکنندههای Docker است. این صفحه توضیح میدهد هر مجموعه چه مواردی را پوشش میدهد، برای یک گردشکار مشخص کدام فرمان باید اجرا شود، آزمونهای زنده چگونه اطلاعات احراز هویت را پیدا میکنند، و چگونه برای باگهای واقعی ارائهدهنده/مدل آزمونهای رگرسیون اضافه کنید.
شروع سریع
در بیشتر روزها:
- گیت کامل (مورد انتظار پیش از push):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - اجرای محلی سریعترِ مجموعهٔ کامل روی دستگاهی با منابع کافی:
pnpm test:max - حلقهٔ مستقیم پایش Vitest:
pnpm test:watch - هدفگیری مستقیم فایل، مسیرهای Plugin/کانال را نیز هدایت میکند:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - هنگام کار تکرارشونده روی یک خرابی، ابتدا اجراهای هدفمند را ترجیح دهید.
- سایت QA مبتنی بر Docker:
pnpm qa:lab:up - مسیر QA مبتنی بر ماشین مجازی Linux:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
وقتی آزمونها را تغییر میدهید یا اطمینان بیشتری میخواهید:
- گزارش پوشش اطلاعرسان V8:
pnpm test:coverage - مجموعهٔ E2E:
pnpm test:e2e
پوشههای موقت آزمون
برای پوشههای موقتی که مالک آنها آزمون است، از ابزارهای کمکی مشترک در test/helpers/temp-dir.ts
استفاده کنید تا مالکیت صریح باشد و پاکسازی در چرخهٔ عمر آزمون باقی بماند:
const tempDirs = useAutoCleanupTempDirTracker(afterEach); it("از یک فضای کاری موقت استفاده میکند", () => { const workspace = tempDirs.make("openclaw-example-"); // استفاده از فضای کاری});useAutoCleanupTempDirTracker(afterEach) عمداً هیچ روش پاکسازی
دستی ارائه نمیکند - Vitest پس از هر آزمون مالک پاکسازی است. ابزارهای کمکی قدیمیترِ سطح پایین
(makeTempDir، cleanupTempDirs، createTempDirTracker) همچنان برای آزمونهایی که
مهاجرت نکردهاند وجود دارند؛ از کاربرد جدید آنها و فراخوانیهای جدید و بدون پوشش
fs.mkdtemp* خودداری کنید، مگر اینکه آزمونی صراحتاً رفتار خام پوشهٔ موقت را
بررسی کند. هنگامی که واقعاً به یک پوشهٔ موقت بدون پوشش نیاز است، یک توضیح مجاز و قابلممیزی
همراه با دلیل اضافه کنید:
// openclaw-temp-dir: allow رفتار پاکسازی خام fs را بررسی میکندconst workspace = fs.mkdtempSync(prefix);node scripts/report-test-temp-creations.mjs ایجاد جدید پوشهٔ موقت بدون پوشش
و استفادهٔ جدید و دستی از ابزار کمکی مشترک را در خطوط افزودهشدهٔ diff گزارش میکند، بدون اینکه
سبکهای پاکسازی موجود را مسدود کند. این گزارش از همان دستهبندی مسیر آزمون
در 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برای مصنوعات CPU/heap/trace مربوط به Kova اجرا کنید. اجراهای زمانبندیشدهٔ روزانه گزارشهای مسیر ارائهدهندهٔ ساختگی، پروفایل عمیق و GPT-5.6 Luna را از طریق یک کار انتشاردهندهٔ جداگانهٔ مصرفکنندهٔ مصنوعات درopenclaw/clawgrit-reportsمنتشر میکنند؛ نبود یا نامعتبر بودن احراز هویت انتشاردهنده باعث شکست اجراهای زمانبندیشده وprofile=releaseمیشود. اجراهای دستی غیرانتشاری، مصنوعات GitHub را حفظ میکنند و انتشار گزارش را جنبهٔ توصیهای میدانند. گزارش ارائهدهندهٔ ساختگی همچنین شامل اعداد راهاندازی Gateway در سطح منبع، حافظه، فشار Plugin، حلقهٔ سلام تکرارشوندهٔ مدل ساختگی و راهاندازی 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و فراخوانهای زمانبندیشده/انتشاری آن اضافه کنید.
- هر مدل انتخابشده یک نوبت متنی بهعلاوهٔ یک کاوش کوچک بهسبک خواندن فایل اجرا میکند.
مدلهایی که فرادادهٔ آنها ورودی
- آزمون دود native گفتوگوی مقید Codex:
pnpm test:docker:live-codex-bind- یک مسیر زندهٔ Docker را در برابر مسیر app-server متعلق به Codex اجرا میکند، یک
پیام خصوصی مصنوعی Slack را با
/codex bindمقید میکند،/codex fastو/codex permissionsرا بهکار میگیرد، سپس تأیید میکند یک پاسخ ساده و یک پیوست تصویر بهجای ACP از طریق اتصال native Plugin مسیریابی میشوند.
- یک مسیر زندهٔ Docker را در برابر مسیر app-server متعلق به Codex اجرا میکند، یک
پیام خصوصی مصنوعی Slack را با
- آزمون دود مهار app-server مربوط به Codex:
pnpm test:docker:live-codex-harness- نوبتهای عامل Gateway را از طریق مهار app-server مربوط به Codex که مالک آن Plugin است
اجرا میکند،
/codex statusو/codex modelsرا تأیید میکند و بهطور پیشفرض کاوشهای تصویر، MCP مربوط به cron، عامل فرعی و 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 را از طریق مهار app-server مربوط به Codex که مالک آن Plugin است
اجرا میکند،
- آزمون دود نصب درخواستی Codex:
pnpm test:docker:codex-on-demand- بستهٔ tar مربوط به OpenClaw را در Docker نصب میکند، راهاندازی اولیه با کلید API
مربوط به OpenAI را اجرا میکند و تأیید میکند Plugin مربوط به Codex بههمراه وابستگی
@openai/codexدر صورت نیاز در ریشهٔ مدیریتشدهٔ پروژهٔ npm بارگیری شدهاند.
- بستهٔ tar مربوط به OpenClaw را در Docker نصب میکند، راهاندازی اولیه با کلید API
مربوط به OpenAI را اجرا میکند و تأیید میکند Plugin مربوط به Codex بههمراه وابستگی
- آزمون دود زندهٔ بستهٔ npm-Plugin مربوط به Codex:
pnpm test:docker:live-codex-npm-plugin- بستهٔ نامزد OpenClaw و Plugin دقیق Codex را در Docker نصب میکند، سپس برای پیشبررسی CLI و نوبتهای همان نشست از یک کلید واقعی OpenAI استفاده میکند.
- نوبت پیگیری آن با تفکر متوسط و بدون تلاش مجدد باید پیشرفت را ارسال کند، کار روی خواندنهای تصادفی فضای کاری و نوشتن یک مصنوع دقیق را ادامه دهد، سپس تکمیل را ارسال کند. نوبت پایانی که فقط پیشرفت را گزارش دهد باعث شکست مسیر میشود.
- آزمون دود زندهٔ وابستگی ابزار Plugin:
pnpm test:docker:live-plugin-tool- یک Plugin آزمایشی را با یک وابستگی واقعی
slugifyبستهبندی میکند، آن را از طریقnpm-pack:نصب میکند، وابستگی را زیر ریشهٔ مدیریتشدهٔ پروژهٔ npm تأیید میکند، سپس از یک مدل زندهٔ OpenAI میخواهد ابزار Plugin را فراخوانی کند و شناسهٔ متنی پنهان را برگرداند.
- یک Plugin آزمایشی را با یک وابستگی واقعی
- آزمون دود فرمان نجات OpenClaw:
pnpm test:live:system-agent-rescue-channel- بررسی دفاع چندلایهٔ اختیاری برای سطح فرمان نجات کانال پیام.
/openclaw statusرا بهکار میگیرد، یک تغییر پایدار مدل را در صف قرار میدهد، با/openclaw yesپاسخ میدهد و مسیر نوشتن ممیزی/پیکربندی را تأیید میکند.
- بررسی دفاع چندلایهٔ اختیاری برای سطح فرمان نجات کانال پیام.
- آزمون دود نخستین اجرای OpenClaw در Docker:
pnpm test:docker:system-agent-first-run- از یک پوشهٔ وضعیت خالی OpenClaw آغاز میکند و ابتدا ثابت میکند CLI بستهبندیشدهٔ
openclaw setupبدون استنتاج بهصورت بسته شکست میخورد. سپس Claude ساختگی را از طریق ماژول فعالسازی بستهبندیشده آزمایش و فعال میکند. تنها پس از آن، یک درخواست مبهم CLI بستهبندیشده به برنامهریز میرسد و به راهاندازی نوعدار تفکیک میشود، و پس از آن عملیات یکبارهٔ مدل، عامل، پیکربندی Discord و SecretRef انجام میشوند. این مسیر پیکربندی و ورودیهای ممیزی را اعتبارسنجی میکند. این شاهد پشتیبان برای گیت/عملیات است، نه مدرکی برای راهاندازی اولیهٔ تعاملی یا عامل/ابزار/تأیید OpenClaw. همین مسیر در QA Lab باpnpm openclaw qa suite --scenario system-agent-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نرمالشده را ذخیره میکند.
اجراکنندههای ویژهٔ QA
وقتی به واقعگرایی qa-lab نیاز دارید، این فرمانها در کنار مجموعههای اصلی آزمون قرار میگیرند.
CI، QA Lab را در گردشکارهای اختصاصی اجرا میکند. همارزی عاملی زیر
QA-Lab - All Lanes و اعتبارسنجی انتشار قرار دارد، نه در یک گردشکار مستقل PR.
اعتبارسنجی گسترده باید از Full Release Validation با
rerun_group=qa-parity یا گروه QA بررسیهای انتشار استفاده کند. بررسیهای انتشار
پایدار/پیشفرض، آزمون فرسایشی جامع زنده/Docker را پشت run_release_soak=true نگه میدارند؛
پروفایل full آزمون فرسایشی را اجباری میکند. QA-Lab - All Lanes هر شب روی main و
از طریق اجرای دستی، با مسیر همارزی ساختگی، مسیر زندهٔ Matrix،
مسیر زندهٔ Telegram مدیریتشده با Convex و مسیر زندهٔ Discord مدیریتشده با Convex بهعنوان
کارهای موازی اجرا میشود. QA زمانبندیشده و بررسیهای انتشار، پروفایل انتشار Matrix را
از طریق آداپتور زندهٔ مشترک اجرا میکنند. مقدار پیشفرض CLI مربوط به Matrix و ورودی گردشکار دستی
همچنان all است؛ اجراهای دستی all به پروفایلهای انتقال، رسانه و
E2EE منشعب میشوند، درحالیکه اجراهای متمرکز میتوانند fast، release یا
transport را انتخاب کنند. OpenClaw Release Checks پیش از تأیید انتشار، همارزی را بههمراه پروفایل قابلاستفادهٔ مجدد
آداپتور زندهٔ Matrix و مسیر Telegram اجرا میکند. بررسیهای انتقال انتشار از
mock-openai/gpt-5.6-luna استفاده میکنند تا قطعی باقی بمانند و از راهاندازی معمول
Plugin ارائهدهنده جلوگیری کنند. این Gatewayهای انتقال زنده
جستوجوی حافظه را غیرفعال میکنند؛ رفتار حافظه همچنان توسط مجموعههای همارزی QA پوشش داده میشود.
شاردهای کامل رسانهٔ زندهٔ انتشار از
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04 استفاده میکنند که از قبل
ffmpeg و ffprobe را دارد. شاردهای مدل/backend زندهٔ Docker از تصویر مشترک
ghcr.io/openclaw/openclaw-live-test:<sha> استفاده میکنند که برای هر commit انتخابشده یکبار ساخته میشود،
سپس بهجای ساخت مجدد در هر شارد، آن را با OPENCLAW_SKIP_DOCKER_BUILD=1 دریافت میکنند.
pnpm openclaw qa suite- سناریوهای QA مبتنی بر مخزن را مستقیماً روی میزبان اجرا میکند.
- برای مجموعه سناریوی انتخابشده، آرتیفکتهای سطحبالای
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همه دستههای فعال بلوغ را انتخاب میکند و هنگامی که آرتیفکت کامل کارت امتیاز لازم باشد، اجرای صریح گردشکار شواهد پروفایل QA را هدف میگیرد. - بهطور پیشفرض، چند سناریوی انتخابشده را با workerهای
gateway ایزوله بهصورت موازی اجرا میکند. مقدار پیشفرض همروندی
qa-channelبرابر 4 است (محدود به تعداد سناریوهای انتخابشده). برای تنظیم تعداد workerها از--concurrency <count>یا برای مسیر سری قدیمیتر از--concurrency 1استفاده کنید. - اگر هر سناریویی ناموفق باشد، با کد غیرصفر خارج میشود. برای تولید
آرتیفکتها بدون کد خروج ناموفق، از
--allow-failuresاستفاده کنید. - از حالتهای ارائهدهنده
live-frontier،mock-openaiوaimockپشتیبانی میکند.aimockیک سرور ارائهدهنده محلی مبتنی بر AIMock را برای پوشش آزمایشی fixture و شبیهسازی پروتکل راهاندازی میکند، بدون آنکه جایگزین مسیر آگاه از سناریویmock-openaiشود.
pnpm openclaw qa coverage --match <query>- شناسهها، عنوانها، سطوح، شناسههای پوشش، ارجاعات مستندات، ارجاعات کد، Pluginها و الزامات ارائهدهنده سناریوها را جستوجو میکند و سپس اهداف مجموعه منطبق را چاپ میکند.
- پیش از اجرای QA Lab، وقتی رفتار یا مسیر فایل تغییرکرده را میدانید اما کوچکترین سناریو را نمیشناسید، از این استفاده کنید. صرفاً راهنما است؛ همچنان بر اساس رفتار در حال تغییر، بین اثبات mock، زنده، Multipass، Matrix یا انتقال انتخاب کنید.
pnpm test:plugins:kitchen-sink-live- مجموعه آزمون دشوار Plugin زنده OpenAI Kitchen Sink را از طریق QA Lab اجرا میکند.
بسته خارجی Kitchen Sink را نصب میکند، فهرست سطوح SDK مربوط به Plugin را
تأیید میکند،
/healthzو/readyzرا میآزماید، شواهد CPU/RSS مربوط به gateway را ثبت میکند، یک نوبت زنده OpenAI را اجرا میکند و تشخیصهای خصمانه را بررسی میکند. به احراز هویت زنده OpenAI مانندOPENAI_API_KEYنیاز دارد. در نشستهای Testbox دارای دادههای احراز هویت، هنگامی که کمککنندهopenclaw-testbox-envموجود باشد، پروفایل احراز هویت زنده Testbox را بهطور خودکار بارگذاری میکند.
- مجموعه آزمون دشوار Plugin زنده OpenAI Kitchen Sink را از طریق QA Lab اجرا میکند.
بسته خارجی Kitchen Sink را نصب میکند، فهرست سطوح SDK مربوط به Plugin را
تأیید میکند،
pnpm test:gateway:cpu-scenarios- بنچ راهاندازی gateway را همراه با یک بسته کوچک از سناریوهای mock در QA Lab
(
channel-chat-baseline،memory-failure-fallback،gateway-restart-inflight-run) اجرا میکند و خلاصه ترکیبی مشاهده CPU را در.artifacts/gateway-cpu-scenarios/مینویسد. - بهطور پیشفرض فقط مشاهدههای مداوم CPU داغ را علامتگذاری میکند (
--cpu-core-warn، با مقدار پیشفرض0.9؛--hot-wall-warn-ms، با مقدار پیشفرض30000)؛ بنابراین جهشهای کوتاه هنگام راهاندازی بهعنوان معیار ثبت میشوند، بدون آنکه شبیه رگرسیون چنددقیقهای اشغال gateway به نظر برسند. - در برابر آرتیفکتهای ساختهشده
distاجرا میشود؛ اگر checkout از قبل خروجی تازه زمان اجرا ندارد، ابتدا build را اجرا کنید.
- بنچ راهاندازی gateway را همراه با یک بسته کوچک از سناریوهای mock در QA Lab
(
pnpm openclaw qa suite --runner multipass- همان مجموعه QA را داخل یک ماشین مجازی Linux یکبارمصرف Multipass اجرا میکند و
همان پرچمهای انتخاب سناریو و ارائهدهنده/مدل
qa suiteرا حفظ میکند. - اجراهای زنده، ورودیهای احراز هویت QA قابلاستفاده برای مهمان را ارسال میکنند:
کلیدهای ارائهدهنده مبتنی بر env، مسیر پیکربندی ارائهدهنده زنده QA و
CODEX_HOMEدر صورت وجود. - دایرکتوریهای خروجی باید زیر ریشه مخزن باقی بمانند تا مهمان بتواند از طریق فضای کاری mountشده در آنها بنویسد.
- گزارش و خلاصه معمول QA را همراه با لاگهای Multipass در
.artifacts/qa-e2e/...مینویسد.
- همان مجموعه QA را داخل یک ماشین مجازی Linux یکبارمصرف Multipass اجرا میکند و
همان پرچمهای انتخاب سناریو و ارائهدهنده/مدل
pnpm qa:lab:up- سایت QA مبتنی بر Docker را برای کار QA بهسبک اپراتور راهاندازی میکند.
pnpm test:docker:npm-onboard-channel-agent- از checkout فعلی یک tarball مربوط به npm میسازد، آن را بهصورت سراسری در Docker نصب میکند، راهاندازی غیرتعاملی کلید API مربوط به OpenAI را اجرا میکند، بهطور پیشفرض Telegram را پیکربندی میکند، تأیید میکند که زمان اجرای بستهبندیشده Plugin بدون ترمیم وابستگی هنگام راهاندازی بارگذاری میشود، doctor را اجرا میکند و یک نوبت عامل محلی را در برابر endpoint شبیهسازیشده OpenAI اجرا میکند.
- برای اجرای همان مسیر نصب بستهبندیشده
با Discord، از
OPENCLAW_NPM_ONBOARD_CHANNEL=discordاستفاده کنید.
pnpm test:docker:session-runtime-context- یک smoke قطعی Docker را برای transcriptهای context زمان اجرای برنامه ساختهشده اجرا میکند.
تأیید میکند که context پنهان زمان اجرای OpenClaw بهعنوان یک پیام سفارشی
غیرقابلنمایش باقی میماند و به نوبت قابلمشاهده کاربر نشت نمیکند، سپس یک JSONL
نشست خرابِ تحتتأثیر را مقداردهی میکند و تأیید میکند که
openclaw doctor --fixآن را همراه با یک نسخه پشتیبان روی شاخه فعال بازنویسی میکند.
- یک smoke قطعی Docker را برای transcriptهای context زمان اجرای برنامه ساختهشده اجرا میکند.
تأیید میکند که context پنهان زمان اجرای OpenClaw بهعنوان یک پیام سفارشی
غیرقابلنمایش باقی میماند و به نوبت قابلمشاهده کاربر نشت نمیکند، سپس یک JSONL
نشست خرابِ تحتتأثیر را مقداردهی میکند و تأیید میکند که
pnpm test:docker:npm-telegram-live- یک نامزد بسته OpenClaw را در Docker نصب میکند، راهاندازی بسته نصبشده را اجرا میکند، Telegram را از طریق CLI نصبشده پیکربندی میکند و سپس مسیر زنده QA مربوط به Telegram را با همان بسته نصبشده بهعنوان Gateway سامانه تحت آزمون دوباره استفاده میکند.
- wrapper فقط منبع harness در
qa-labرا از checkout mount میکند؛ بسته نصبشده مالکdist،openclaw/plugin-sdkو زمان اجرای Pluginهای همراه است؛ بنابراین این مسیر، Pluginهای checkout فعلی را با بسته تحت آزمون ترکیب نمیکند. - مقدار پیشفرض
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@betaاست؛ برای آزمودن یک tarball محلی resolveشده بهجای نصب از registry،OPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzیاOPENCLAW_CURRENT_PACKAGE_TGZرا تنظیم کنید. - بهطور پیشفرض با
OPENCLAW_NPM_TELEGRAM_RTT_SAMPLES=20زمانبندی تکرارشونده RTT را درqa-evidence.jsonمنتشر میکند. برای تنظیم اجرا،OPENCLAW_NPM_TELEGRAM_RTT_SAMPLES،OPENCLAW_NPM_TELEGRAM_RTT_TIMEOUT_MSیاOPENCLAW_NPM_TELEGRAM_RTT_MAX_FAILURESرا بازنویسی کنید.OPENCLAW_NPM_TELEGRAM_RTT_CHECKSسناریوی QA مربوط به Telegram را برای نمونهبرداری انتخاب میکند؛ هدف RTT پشتیبانیشدهchannel-canaryاست. - از همان اعتبارنامههای env مربوط به Telegram یا منبع اعتبارنامه Convex در
pnpm openclaw qa telegramاستفاده میکند. برای خودکارسازی CI/انتشار،OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexرا همراه باOPENCLAW_QA_CONVEX_SITE_URLو یک secret نقش تنظیم کنید. اگرOPENCLAW_QA_CONVEX_SITE_URLو یک secret نقش Convex در CI موجود باشند، wrapper مربوط به Docker بهطور خودکار Convex را انتخاب میکند. - wrapper پیش از کار build/install در Docker، env اعتبارنامه Telegram یا Convex را
روی میزبان اعتبارسنجی میکند.
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1را فقط هنگامی تنظیم کنید که عمداً در حال اشکالزدایی تنظیمات پیش از اعتبارنامه هستید. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainerمقدار مشترکOPENCLAW_QA_CREDENTIAL_ROLEرا فقط برای این مسیر بازنویسی میکند. وقتی اعتبارنامههای Convex انتخاب شدهاند و هیچ نقشی تنظیم نشده است، wrapper در CI ازciو خارج از CI ازmaintainerاستفاده میکند.- GitHub Actions این مسیر را بهعنوان گردشکار دستی نگهدارنده
NPM Telegram Beta E2Eارائه میکند. هنگام merge اجرا نمیشود. این گردشکار از محیطqa-live-sharedو اجارههای اعتبارنامه CI مربوط به Convex استفاده میکند.
- GitHub Actions همچنین
Package Acceptanceرا برای اثبات جانبی محصول در برابر یک بسته نامزد ارائه میکند. این گردشکار یک Git ref، مشخصه منتشرشده npm، نشانی URL مربوط به tarball از طریق HTTPS بههمراه SHA-256، سیاست URL مورداعتماد یا آرتیفکت tarball از اجرای دیگری (source=ref|npm|url|trusted-url|artifact) را میپذیرد،openclaw-current.tgzنرمالشده را با نامpackage-under-testبارگذاری میکند و سپس زمانبند E2E موجود Docker را با پروفایلهای مسیرsmoke،package،product،fullیاcustomاجرا میکند. برای اجرای گردشکار QA مربوط به Telegram در برابر همان آرتیفکتpackage-under-test، مقدارtelegram_mode=mock-openaiیاlive-frontierرا تنظیم کنید.- اثبات محصول آخرین نسخه بتا:
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 به digest نیاز دارد و از سیاست ایمنی 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- mirrorهای 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=packagesource=trusted-url مقدار .github/package-trusted-sources.json را از ref گردشکار مورداعتماد میخواند و اعتبارنامههای URL یا دورزدن شبکه خصوصی از طریق ورودی گردشکار را نمیپذیرد. اگر سیاست نامبرده احراز هویت bearer را اعلام میکند، secret ثابت 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- build فعلی OpenClaw را در Docker بستهبندی و نصب میکند، Gateway را با پیکربندی OpenAI راهاندازی میکند و سپس channel/Pluginهای همراه را از طریق ویرایشهای پیکربندی فعال میکند.
- تأیید میکند که کشف راهاندازی، Pluginهای دانلودشدنی پیکربندینشده را غایب نگه میدارد، نخستین ترمیم doctor پس از پیکربندی هر Plugin دانلودشدنی گمشده را صریحاً نصب میکند و راهاندازی مجدد دوم، ترمیم پنهان وابستگی را اجرا نمیکند.
- همچنین یک baseline قدیمی و شناختهشده npm را نصب میکند، پیش از اجرای
openclaw update --tag <candidate>، Telegram را فعال میکند و تأیید میکند که doctor پس از بهروزرسانی نامزد، بقایای وابستگی قدیمی Plugin را بدون ترمیم postinstall در سمت harness پاک میکند.
-
pnpm test:parallels:npm-update-
smoke بومی بهروزرسانی نصب بستهبندیشده را در مهمانهای Parallels اجرا میکند. هر پلتفرم انتخابشده ابتدا بسته baseline درخواستی را نصب میکند، سپس فرمان نصبشده
openclaw updateرا در همان مهمان اجرا میکند و نسخه نصبشده، وضعیت بهروزرسانی، آمادگی gateway و یک نوبت عامل محلی را تأیید میکند. -
هنگام تکرار روی یک مهمان، از
--platform macos،--platform windowsیا--platform linuxاستفاده کنید. برای مسیر آرتیفکت خلاصه و وضعیت هر مسیر از--jsonاستفاده کنید. -
مسیر OpenAI بهطور پیشفرض برای اثبات نوبت زنده عامل از
openai/gpt-5.6-lunaاستفاده میکند. برای اعتبارسنجی مدل دیگری از OpenAI،--model <provider/model>را ارسال یاOPENCLAW_PARALLELS_OPENAI_MODELرا تنظیم کنید. -
اجراهای طولانی محلی را در timeout میزبان قرار دهید تا توقفهای انتقال 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.*مینویسد. پیش از آنکه فرض کنید wrapper بیرونی متوقف شده است،windows-update.log،macos-update.logیاlinux-update.logرا بررسی کنید. -
بهروزرسانی Windows روی یک مهمان سرد ممکن است 10 تا 15 دقیقه صرف doctor پس از بهروزرسانی و کار بهروزرسانی بسته کند؛ تا زمانی که لاگ اشکالزدایی تودرتوی npm در حال پیشروی است، این وضعیت همچنان سالم است.
-
این wrapper تجمیعی را همزمان با مسیرهای منفرد smoke مربوط به macOS، Windows یا Linux در Parallels اجرا نکنید. آنها وضعیت ماشین مجازی را بهاشتراک میگذارند و ممکن است هنگام بازیابی snapshot، ارائه بسته یا وضعیت gateway مهمان با یکدیگر تداخل کنند.
-
اثبات پس از بهروزرسانی، سطح معمول Pluginهای همراه را اجرا میکند، زیرا facadeهای قابلیت مانند گفتار، تولید تصویر و درک رسانه از طریق APIهای زمان اجرای همراه بارگذاری میشوند، حتی هنگامی که خود نوبت عامل فقط یک پاسخ متنی ساده را بررسی میکند.
-
-
pnpm openclaw qa aimock- فقط سرور محلی ارائهدهنده AIMock را برای آزمون دود مستقیم پروتکل راهاندازی میکند.
-
pnpm openclaw qa matrix- مسیر QA زنده Matrix را در برابر یک homeserver موقت Tuwunel با پشتوانه Docker
اجرا میکند. فقط برای checkout کد منبع است — نصبهای بستهبندیشده
qa-labرا ارائه نمیکنند. - CLI کامل، کاتالوگ پروفایل/سناریو، متغیرهای محیطی و چیدمان آرتیفکت: مسیرهای آزمون دود Matrix.
- مسیر QA زنده Matrix را در برابر یک homeserver موقت Tuwunel با پشتوانه Docker
اجرا میکند. فقط برای checkout کد منبع است — نصبهای بستهبندیشده
-
pnpm openclaw qa telegram- مسیر QA زنده Telegram را در برابر یک گروه خصوصی واقعی، با استفاده از توکنهای ربات درایور و SUT از محیط اجرا میکند.
- به
OPENCLAW_QA_TELEGRAM_GROUP_ID،OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENوOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKENنیاز دارد. شناسه گروه باید شناسه عددی گفتوگوی Telegram باشد. - برای اعتبارنامههای تجمیعی اشتراکی از
--credential-source convexپشتیبانی میکند. بهطور پیشفرض از حالت محیط استفاده کنید، یا برای انتخاب اجارههای تجمیعیOPENCLAW_QA_CREDENTIAL_SOURCE=convexرا تنظیم کنید. - پیشفرضها canary، دروازهگذاری اشاره، آدرسدهی فرمان،
/status، پاسخهای اشارهشده رباتبهربات و پاسخهای فرمان بومی هسته را پوشش میدهند. پیشفرضهایmock-openaiرگرسیونهای زنجیره پاسخ قطعی و پخش جریانی پیام نهایی Telegram را نیز پوشش میدهند. برای کاوشهای اختیاری مانندsession_statusاز--list-scenariosاستفاده کنید. - اگر هر سناریویی شکست بخورد، با کد غیرصفر خارج میشود. برای تولید
آرتیفکتها بدون کد خروج شکست، از
--allow-failuresاستفاده کنید. - به دو ربات متمایز در یک گروه خصوصی واحد نیاز دارد و ربات SUT باید یک نام کاربری Telegram ارائه کند.
- برای مشاهده پایدار رباتبهربات، حالت Bot-to-Bot Communication Mode را
در
@BotFatherبرای هر دو ربات فعال کنید و مطمئن شوید ربات درایور میتواند ترافیک رباتهای گروه را مشاهده کند. - یک گزارش QA مربوط به Telegram، خلاصه و
qa-evidence.jsonرا زیر.artifacts/qa-e2e/...مینویسد. سناریوهای پاسخدهی شامل RTT از درخواست ارسال درایور تا پاسخ مشاهدهشده SUT هستند.
Mantis Telegram Live پوشش شواهد PR پیرامون این مسیر است. این پوشش،
رف کاندید را با اعتبارنامههای Telegram اجارهشده از Convex اجرا میکند، بسته
گزارش/شواهد QA پاکسازیشده را در مرورگر دسکتاپ Crabbox رندر میکند، شواهد MP4
را ضبط میکند، یک GIF برشخورده بر اساس حرکت تولید میکند، بسته آرتیفکت را بارگذاری میکند و
هنگامی که pr_number تنظیم شده باشد، شواهد درونخطی PR را از طریق Mantis GitHub App
ارسال میکند. نگهدارندگان میتوانند آن را از رابط Actions از طریق Mantis Scenario
(scenario_id: telegram-live) یا مستقیماً از یک نظر Pull request آغاز کنند:
@openclaw-mantis telegram@openclaw-mantis telegram scenario=telegram-status-command@openclaw-mantis telegram scenarios=telegram-status-command,channel-canaryMantis Telegram Desktop Proof پوشش عاملمحور بومی Telegram Desktop
برای شواهد بصری قبل/بعد PR است. آن را از رابط Actions با
instructions آزاد، از طریق Mantis Scenario (scenario_id: telegram-desktop-proof) یا از یک نظر PR آغاز کنید:
@openclaw-mantis telegram desktop proofعامل Mantis، PR را میخواند، تصمیم میگیرد چه رفتار قابلمشاهدهای در Telegram
تغییر را اثبات میکند، مسیر اثبات کاربر واقعی Telegram Desktop در Crabbox را روی
رفهای مبنا و کاندید اجرا میکند، تا مفیدشدن GIFهای بومی تکرار میکند،
یک مانیفست جفتشده motionPreview مینویسد و هنگامی که
pr_number تنظیم شده باشد، همان جدول GIF دو ستونی را از طریق Mantis GitHub App ارسال میکند.
pnpm openclaw qa mantis telegram-desktop-builder- یک دسکتاپ لینوکس Crabbox را اجاره میکند یا دوباره بهکار میگیرد، Telegram Desktop بومی را نصب میکند، OpenClaw را با توکن اجارهشده ربات SUT مربوط به Telegram پیکربندی میکند، Gateway را راهاندازی میکند و از دسکتاپ قابلمشاهده VNC شواهد اسکرینشات/MP4 ضبط میکند.
- بهطور پیشفرض
--credential-source convexاست تا گردشهای کاری فقط به رمز broker مربوط به Convex نیاز داشته باشند. از--credential-source envبا همان متغیرهایOPENCLAW_QA_TELEGRAM_*مانندpnpm openclaw qa telegramاستفاده کنید. - Telegram Desktop همچنان به ورود/پروفایل کاربر نیاز دارد. توکن ربات
فقط OpenClaw را پیکربندی میکند. از
--telegram-profile-archive-env <name>برای آرشیو پروفایل base64 مربوط به.tgzاستفاده کنید، یا از--keep-leaseاستفاده کنید و یکبار بهصورت دستی از طریق VNC وارد شوید. mantis-telegram-desktop-builder-report.md،mantis-telegram-desktop-builder-summary.json،telegram-desktop-builder.pngوtelegram-desktop-builder.mp4را زیر دایرکتوری خروجی مینویسد.
مسیرهای انتقال زنده یک قرارداد استاندارد مشترک دارند تا انتقالهای جدید
دچار واگرایی نشوند؛ ماتریس پوشش هر مسیر در
نمای کلی QA — پوشش انتقال زنده قرار دارد.
qa-channel مجموعه مصنوعی گسترده است و بخشی از آن ماتریس نیست.
اعتبارنامههای اشتراکی Telegram از طریق Convex (v1)
هنگامی که --credential-source convex (یا OPENCLAW_QA_CREDENTIAL_SOURCE=convex)
برای QA انتقال زنده فعال باشد، آزمایشگاه QA یک اجاره انحصاری را از یک
مخزن با پشتوانه 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 حلقهبازگشت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، رمزهای broker،
پیشوند نقطه پایانی، مهلت HTTP و دسترسیپذیری admin/list را بدون چاپ
مقادیر رمز بررسی کنید. برای خروجی قابلخواندن توسط ماشین در اسکریپتها و ابزارهای CI
از --json استفاده کنید.
قرارداد پیشفرض نقطه پایانی (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 }
- درخواست:
شکل payload برای نوع Telegram:
{ groupId: string, driverToken: string, sutToken: string }groupIdباید یک رشته شناسه عددی گفتوگوی Telegram باشد.admin/addاین شکل را برایkind: "telegram"اعتبارسنجی و payloadهای بدشکل را رد میکند.
شکل payload برای نوع کاربر واقعی 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"برای گردش کار اثبات Telegram Desktop مربوط به Mantis رزرو شده است. مسیرهای عمومی آزمایشگاه QA هرگز نباید آن را دریافت کنند.
payloadهای چندکاناله اعتبارسنجیشده توسط broker:
- 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 نیز میتوانند از مخزن اجاره بگیرند، اما اعتبارسنجی payload مربوط به Slack
در حال حاضر بهجای broker در اجراکننده QA مربوط به Slack قرار دارد. برای ردیفهای Slack از
{ channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }
استفاده کنید.
افزودن یک کانال به QA
معماری و نام ابزارهای کمکی سناریو برای آداپتورهای کانال جدید در
نمای کلی QA — افزودن یک کانال قرار دارند.
حداقل معیار: اجراکننده انتقال را روی seam میزبان مشترک qa-lab
پیادهسازی کنید، یک adapterFactory برای سناریوهای مشترک اضافه کنید، qaRunners را در
مانیفست Plugin اعلام کنید، بهصورت openclaw qa <runner> mount کنید و سناریوها را زیر
qa/scenarios/ بنویسید.
مجموعههای آزمون (چه چیزی کجا اجرا میشود)
مجموعهها را «واقعگرایی فزاینده» (و بیثباتی/هزینه فزاینده) در نظر بگیرید.
واحد / یکپارچهسازی (پیشفرض)
- فرمان:
pnpm test - پیکربندی: اجراهای بدون هدف از مجموعه shard مربوط به
vitest.full-*.config.tsاستفاده میکنند و ممکن است shardهای چندپروژهای را برای زمانبندی موازی به پیکربندیهای هر پروژه گسترش دهند - فایلها: موجودیهای هسته/واحد زیر
src/**/*.test.ts،packages/**/*.test.tsوtest/**/*.test.ts؛ آزمونهای واحد UI در shard اختصاصیunit-uiاجرا میشوند - دامنه:
- آزمونهای واحد خالص
- آزمونهای یکپارچهسازی درونفرایندی (احراز هویت Gateway، مسیریابی، ابزارها، تجزیه، پیکربندی)
- رگرسیونهای قطعی برای باگهای شناختهشده
- انتظارات:
- در CI اجرا میشود
- به کلیدهای واقعی نیاز ندارد
- باید سریع و پایدار باشد
- آزمونهای resolver و بارگذار سطح عمومی باید رفتار fallback گسترده
api.jsوruntime-api.jsرا با fixtureهای کوچک تولیدشده Plugin اثبات کنند، نه APIهای کد منبع Pluginهای همراه واقعی. بارگذاری APIهای Plugin واقعی به مجموعههای قرارداد/یکپارچهسازی تحت مالکیت Plugin تعلق دارد.
سیاست وابستگی بومی:
- نصبهای آزمون پیشفرض، ساختهای اختیاری بومی opus مربوط به Discord را رد میکنند. صدای Discord
از
libopus-wasmهمراه استفاده میکند و@discordjs/opusدرallowBuildsغیرفعال میماند تا آزمونهای محلی و مسیرهای Testbox افزونه بومی را کامپایل نکنند. - عملکرد opus بومی را در مخزن بنچمارک
libopus-wasmمقایسه کنید، نه در حلقههای پیشفرض نصب/آزمون OpenClaw. درallowBuildsپیشفرض،@discordjs/opusرا رویtrueتنظیم نکنید؛ این کار باعث میشود حلقههای نامرتبط نصب/آزمون کد بومی را کامپایل کنند.
پروژهها، shardها و مسیرهای محدودشده
- اجرای بدون هدف
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 را در ماشینهای پربار کاهش میدهد و مانع از آن میشود که کارهای پاسخ خودکار/Plugin، مجموعههای نامرتبط را از منابع محروم کنند. pnpm test --watchهمچنان از گراف بومی پروژهٔ ریشهٔvitest.config.tsاستفاده میکند، زیرا حلقهٔ پایش چندشارده عملی نیست.pnpm test،pnpm test:watchوpnpm test:perf:importsابتدا اهداف صریح فایل/دایرکتوری را از مسیرهای محدود عبور میدهند، تاpnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsهزینهٔ کامل راهاندازی پروژهٔ ریشه را نپردازد.pnpm test:changedبهطور پیشفرض مسیرهای تغییریافتهٔ git را به مسیرهای محدود و کمهزینه گسترش میدهد: ویرایشهای مستقیم آزمون، فایلهای همجوار*.test.ts، نگاشتهای صریح منبع و وابستههای گراف واردسازی محلی. ویرایشهای پیکربندی/راهاندازی/بسته، آزمونها را بهصورت گسترده اجرا نمیکنند، مگر اینکه صراحتاً ازOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changedاستفاده کنید.pnpm check:changedدروازهٔ معمول و هوشمند بررسی محلی برای کارهای محدود است. این دستور تفاوتها را به هسته، آزمونهای هسته، افزونهها، آزمونهای افزونه، برنامهها، مستندات، فرادادهٔ انتشار، ابزارهای زندهٔ Docker و ابزارسازی دستهبندی میکند، سپس فرمانهای بررسی نوع، lint و محافظ متناظر را اجرا میکند. آزمونهای Vitest را اجرا نمیکند؛ برای ارائهٔ مدرک آزمون،pnpm test:changedیاpnpm test <target>صریح را فراخوانی کنید. افزایش نسخههایی که فقط فرادادهٔ انتشار را تغییر میدهند، بررسیهای هدفمند نسخه/پیکربندی/وابستگی ریشه را اجرا میکنند و محافظی دارند که تغییرات بسته خارج از فیلد نسخهٔ سطح بالا را رد میکند.- ویرایشهای هارنس زندهٔ Docker برای ACP بررسیهای متمرکز اجرا میکنند: نحو پوسته برای اسکریپتهای احراز هویت زندهٔ Docker و یک اجرای آزمایشی زمانبند زندهٔ Docker. تغییرات
package.jsonفقط زمانی لحاظ میشوند که تفاوت بهscripts["test:docker:live-*"]محدود باشد؛ ویرایشهای وابستگی، خروجی، نسخه و سایر سطوح بسته همچنان از محافظهای گستردهتر استفاده میکنند. - آزمونهای واحد با واردسازی سبک از عاملها، فرمانها، Pluginها، ابزارهای کمکی پاسخ خودکار،
plugin-sdkو بخشهای مشابهِ ابزارهای خالص، از مسیرunit-fastعبور میکنند کهtest/setup-openclaw-runtime.tsرا رد میکند؛ فایلهای حالتمند/سنگین از نظر زمان اجرا در مسیرهای موجود باقی میمانند. - فایلهای منبع کمکی منتخب
plugin-sdkوcommandsنیز اجراهای حالت تغییر را به آزمونهای همجوار صریح در همان مسیرهای سبک نگاشت میکنند، تا ویرایش ابزارهای کمکی باعث اجرای دوبارهٔ کل مجموعهٔ سنگین آن دایرکتوری نشود. auto-replyسطلهای اختصاصی برای ابزارهای کمکی سطح بالای هسته، آزمونهای یکپارچهسازی سطح بالایreply.*و زیردرختsrc/auto-reply/reply/**دارد. CI زیردرخت پاسخ را نیز به شاردهای اجراکنندهٔ عامل، ارسال و فرمانها/مسیریابی حالت تقسیم میکند تا یک سطل با واردسازی سنگین، کل دنبالهٔ Node را در اختیار نگیرد.- پایپلاین CI معمول PR/main عمداً پیمایش دستهای Pluginهای همراه و شارد صرفاً انتشاری
agentic-pluginsرا نادیده میگیرد. اعتبارسنجی کامل انتشار، گردشکار فرزند جداگانهٔPlugin Prereleaseرا برای آن مجموعههای سنگین از نظر Plugin روی نامزدهای انتشار اجرا میکند.
پوشش اجراکنندهٔ تعبیهشده
- هنگام تغییر ورودیهای کشف ابزار پیام یا زمینهٔ زمان اجرای 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را ثابت میکند و در پروژههای ریشه، پیکربندیهای e2e و زنده از اجراکنندهٔ غیرایزوله استفاده میکند. - مسیر رابط کاربری ریشه، راهاندازی و بهینهساز
jsdomخود را حفظ میکند، اما آن نیز روی اجراکنندهٔ مشترک غیرایزوله اجرا میشود. - هر شارد
pnpm testهمان پیشفرضهایthreads+isolate: falseرا از پیکربندی مشترک Vitest به ارث میبرد. scripts/run-vitest.mjsبهطور پیشفرض--no-maglevرا برای فرایندهای فرزند Node در Vitest اضافه میکند تا سربار کامپایل V8 در اجراهای بزرگ محلی کاهش یابد. برای مقایسه با رفتار استاندارد V8،OPENCLAW_VITEST_ENABLE_MAGLEV=1را تنظیم کنید.scripts/run-vitest.mjsاجراهای صریح و غیرپایشی Vitest را پس از 5 دقیقه بدون هیچ خروجی stdout یا stderr خاتمه میدهد. برای غیرفعالکردن ناظر در یک بررسی عمداً بیصدا،OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=0را تنظیم کنید.
تکرار سریع محلی
pnpm changed:lanesنشان میدهد یک تفاوت کدام مسیرهای معماری را فعال میکند.- قلاب پیش از commit فقط قالببندی انجام میدهد. فایلهای قالببندیشده را دوباره stage میکند و lint، بررسی نوع یا آزمونها را اجرا نمیکند.
- هنگامی که به دروازهٔ هوشمند بررسی محلی نیاز دارید، پیش از تحویل یا push،
pnpm check:changedرا صراحتاً اجرا کنید. pnpm test:changedبهطور پیشفرض از مسیرهای محدود و کمهزینه عبور میکند. فقط زمانی ازOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changedاستفاده کنید که عامل تشخیص دهد ویرایش هارنس، پیکربندی، بسته یا قرارداد واقعاً به پوشش گستردهتر Vitest نیاز دارد.pnpm test:maxوpnpm test:changed:maxهمان رفتار مسیریابی را حفظ میکنند، اما سقف worker بالاتری دارند.- مقیاسدهی خودکار workerهای محلی عمداً محافظهکارانه است و هنگامی که میانگین بار میزبان از قبل بالا باشد عقبنشینی میکند، تا چند اجرای همزمان 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 دارای الگوی include، نام شارد را اضافه میکنند تا شاردهای فیلترشده بتوانند جداگانه ردیابی شوند. - هنگامی که یک آزمون داغ همچنان بیشتر زمان خود را صرف واردسازیهای راهاندازی میکند،
وابستگیهای سنگین را پشت یک مرز محلی و محدود
*.runtime.tsنگه دارید و بهجای واردسازی عمیق ابزارهای کمکی زمان اجرا صرفاً برای عبور دادن آنها ازvi.mock(...)، همان مرز را مستقیماً mock کنید. pnpm test:perf:changed:bench -- --ref <git-ref>،test:changedمسیریابیشده را با مسیر بومی پروژهٔ ریشه برای همان تفاوت commitشده مقایسه میکند و زمان واقعی بههمراه حداکثر 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، هرکدام اجباری با یک worker - دامنه:
- یک Gateway واقعی loopback را با عیبیابی فعال بهطور پیشفرض راهاندازی میکند
- چرخش مصنوعی پیام Gateway، حافظه و payload بزرگ را از مسیر رویداد عیبیابی عبور میدهد
- از طریق RPC مبتنی بر WS در Gateway،
diagnostics.stabilityرا پرسوجو میکند - ابزارهای کمکی ماندگاری بستهٔ پایداری عیبیابی را پوشش میدهد
- تأیید میکند که ضبطکننده محدود میماند، نمونههای مصنوعی RSS زیر بودجهٔ فشار باقی میمانند و عمق صف هر نشست دوباره به صفر تخلیه میشود
- انتظارات:
- ایمن برای CI و بدون نیاز به کلید
- مسیری محدود برای پیگیری رگرسیون پایداری، نه جایگزینی برای مجموعهٔ کامل Gateway
E2E (تجمیع مخزن)
- فرمان:
pnpm test:e2e - دامنه:
- مسیر E2E دودِ Gateway را اجرا میکند
- مسیر E2E مرورگر mockشدهٔ رابط کاربری کنترل را اجرا میکند
- انتظارات:
- ایمن برای CI و بدون نیاز به کلید
- نیازمند نصب بودن Chromium مربوط به Playwright است
E2E (آزمون دود Gateway)
- فرمان:
pnpm test:e2e:gateway - پیکربندی:
test/vitest/vitest.e2e.config.ts - فایلها:
src/**/*.e2e.test.ts،test/**/*.e2e.test.tsو آزمونهای E2E مربوط به Pluginهای همراه درextensions/ - پیشفرضهای زمان اجرا:
- از
threadsدر Vitest همراه باisolate: falseاستفاده میکند که با بقیهٔ مخزن همخوان است. - از workerهای تطبیقی استفاده میکند (CI: حداکثر 2، محلی: بهطور پیشفرض 1).
- برای کاهش سربار ورودی/خروجی کنسول، بهطور پیشفرض در حالت بیصدا اجرا میشود.
- از
- بازنویسیهای مفید:
OPENCLAW_E2E_WORKERS=<n>برای اجبار تعداد workerها (با سقف 16).OPENCLAW_E2E_VERBOSE=1برای فعالکردن دوبارهٔ خروجی مفصل کنسول.
- دامنه:
- رفتار سرتاسری Gateway چندنمونهای
- سطوح WebSocket/HTTP، جفتسازی Node و شبکهسازی سنگینتر
- انتظارات:
- در CI اجرا میشود (هنگامی که در پایپلاین فعال باشد)
- به کلید واقعی نیاز ندارد
- اجزای متحرک بیشتری نسبت به آزمونهای واحد دارد (ممکن است کندتر باشد)
E2E (مرورگر mockشدهٔ رابط کاربری کنترل)
- فرمان:
pnpm test:ui:e2e - پیکربندی:
test/vitest/vitest.ui-e2e.config.ts - فایلها:
ui/src/**/*.e2e.test.ts - دامنه:
- رابط کاربری کنترل Vite را راهاندازی میکند
- یک صفحهٔ واقعی Chromium را از طریق Playwright هدایت میکند
- WebSocket مربوط به Gateway را با mockهای قطعی درونمرورگری جایگزین میکند
- انتظارات:
- در CI بهعنوان بخشی از
pnpm test:e2eاجرا میشود - به Gateway واقعی، عاملها یا کلیدهای ارائهدهنده نیاز ندارد
- وابستگی مرورگر باید موجود باشد (
pnpm --dir ui exec playwright install chromium)
- در CI بهعنوان بخشی از
E2E: آزمون دود backend مربوط به OpenShell
- فرمان:
pnpm test:e2e:openshell - فایل:
extensions/openshell/src/backend.e2e.test.ts - دامنه:
- از یک gateway محلی فعال OpenShell دوباره استفاده میکند
- از یک Dockerfile محلی موقت، sandbox ایجاد میکند
- backend مربوط به OpenShell در OpenClaw را از طریق
sandbox ssh-configواقعی + اجرای SSH به کار میگیرد - رفتار سامانهٔ فایل استانداردِ راهدور را از طریق پل fs در sandbox تأیید میکند
- انتظارات:
- فقط با انتخاب صریح؛ بخشی از اجرای پیشفرض
pnpm test:e2eنیست - به یک CLI محلی
openshellبههمراه daemon فعال Docker نیاز دارد - به یک gateway محلی فعال OpenShell و منبع پیکربندی آن نیاز دارد
- از
HOME/XDG_CONFIG_HOMEایزوله استفاده میکند، سپس sandbox آزمون را از بین میبرد
- فقط با انتخاب صریح؛ بخشی از اجرای پیشفرض
- بازنویسیهای مفید:
OPENCLAW_E2E_OPENSHELL=1برای فعالکردن آزمون هنگام اجرای دستی مجموعهٔ گستردهتر e2eOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshellبرای اشاره به یک فایل اجرایی CLI یا اسکریپت wrapper غیراپیشفرضOPENCLAW_E2E_OPENSHELL_CONFIG_HOME=/path/to/configبرای در معرض قرار دادن پیکربندی gateway ثبتشده برای آزمون ایزولهOPENCLAW_E2E_OPENSHELL_HOST_IP=172.18.0.1برای بازنویسی IP مربوط به gateway در Docker که fixture سیاست میزبان از آن استفاده میکند
زنده (ارائهدهندگان واقعی + مدلهای واقعی)
- دستور:
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 backend، آزمونهای دود ACP، چارچوب app-server مربوط به 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) و دایرکتوری پیکربندی محلی، فضای کاری و فایل اختیاری محیط پروفایل شما را mount میکنند. نقاط ورود محلی متناظر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 را یکبار از طریقscripts/package-openclaw-for-docker.mjsبهصورت tarball مربوط به npm بستهبندی میکند و سپس دو تصویرscripts/e2e/Dockerfileرا میسازد/دوباره استفاده میکند. تصویر پایه فقط اجراکنندهٔ Node/Git برای مسیرهای نصب/بهروزرسانی/وابستگی Plugin است؛ این مسیرها tarball ازپیشساختهشده را mount میکنند. تصویر کاربردی همان tarball را برای مسیرهای عملکرد برنامهٔ ساختهشده در/appنصب میکند. تعریف مسیرهای Docker درscripts/lib/docker-e2e-scenarios.mjsقرار دارد؛ منطق برنامهریز درscripts/lib/docker-e2e-plan.mjsقرار دارد؛scripts/test-docker-all.mjsبرنامهٔ انتخابشده را اجرا میکند. اجرای تجمیعی از زمانبند محلی وزندار استفاده میکند:OPENCLAW_DOCKER_ALL_PARALLELISMشکافهای فرایند را کنترل میکند، درحالیکه سقف منابع مانع شروع همزمان همهٔ مسیرهای سنگین زنده، نصب npm و چندسرویسی میشود. اگر یک مسیر از سقفهای فعال سنگینتر باشد، زمانبند همچنان میتواند آن را هنگام خالیبودن مخزن شروع کند و سپس تا زمانی که ظرفیت دوباره در دسترس شود، آن را بهتنهایی در حال اجرا نگه میدارد. مقادیر پیشفرض 10 شکاف،OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9،OPENCLAW_DOCKER_ALL_NPM_LIMIT=5وOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7هستند؛ تنها زمانیOPENCLAW_DOCKER_ALL_WEIGHT_LIMITیاOPENCLAW_DOCKER_ALL_DOCKER_LIMIT(و سایر بازنویسیهایOPENCLAW_DOCKER_ALL_<RESOURCE>_LIMIT) را تنظیم کنید که میزبان Docker ظرفیت بیشتری داشته باشد. اجراکننده بهطور پیشفرض پیشبررسی Docker را انجام میدهد، کانتینرهای قدیمی E2E مربوط به OpenClaw را حذف میکند، هر 30 ثانیه وضعیت را چاپ میکند، زمانبندی مسیرهای موفق را در.artifacts/docker-tests/lane-timings.jsonذخیره میکند و در اجراهای بعدی از این زمانبندیها برای شروع زودتر مسیرهای طولانیتر استفاده میکند. برای چاپ مانیفست وزندار مسیرها بدون ساخت یا اجرای Docker ازOPENCLAW_DOCKER_ALL_DRY_RUN=1استفاده کنید، یا برای چاپ برنامهٔ CI شامل مسیرهای انتخابشده، نیازهای بسته/تصویر و اعتبارنامهها ازnode scripts/test-docker-all.mjs --plan-jsonاستفاده کنید.Package Acceptanceدروازهٔ بومی GitHub برای بسته و پاسخ به این پرسش است: «آیا این tarball قابلنصب بهعنوان یک محصول کار میکند؟» این دروازه یک بستهٔ نامزد را ازsource=npm،source=ref،source=url،source=trusted-urlیاsource=artifactتعیین میکند، آن را بهعنوانpackage-under-testبارگذاری میکند و سپس مسیرهای قابلاستفادهٔ مجدد Docker E2E را بهجای بستهبندی مجدد ارجاع انتخابشده، روی دقیقاً همان tarball اجرا میکند. پروفایلها بهترتیب گستردگی مرتب شدهاند:smoke،package،productوfull(بهعلاوهٔcustomبرای فهرست صریح مسیرها). برای قرارداد بسته/بهروزرسانی/Plugin، ماتریس دوام پس از ارتقای منتشرشده، پیشفرضهای انتشار و عیبیابی خرابی، آزمون بهروزرسانیها و Pluginها را ببینید.- بررسیهای ساخت و انتشار پس از tsdown،
scripts/check-cli-bootstrap-imports.mjsرا اجرا میکنند. این محافظ گراف ایستای ساختهشده را ازdist/entry.jsوdist/cli/run-main.jsپیمایش میکند و اگر آن گراف راهاندازی پیش از اعزام دستور، هر بستهٔ خارجی را بهصورت ایستا import کند (Commander، رابط کاربری اعلان، undici، گزارشگیری و وابستگیهای سنگین مشابه هنگام راهاندازی همگی محاسبه میشوند)، ناموفق میشود؛ همچنین اندازهٔ قطعهٔ بستهبندیشدهٔ اجرای Gateway را به 70 KB محدود میکند و import ایستای مسیرهای سرد شناختهشدهٔ 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، نبود فایلهای patch در فیکسچر git مشتقشده از tarball، نبود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 که tarball بستهبندیشدهٔ OpenClaw را از طریق
scripts/lib/openclaw-e2e-instance.shنصب میکنند،npm installرا بهOPENCLAW_E2E_NPM_INSTALL_TIMEOUTمحدود میکنند (پیشفرض600s؛ برای غیرفعالکردن پوششدهنده هنگام اشکالزدایی،0را تنظیم کنید).
اجراکنندههای Docker مدل زنده همچنین فقط خانههای احراز هویت CLI موردنیاز (یا همهٔ موارد پشتیبانیشده، وقتی اجرا محدود نشده است) را bind-mount میکنند و سپس پیش از اجرا آنها را در خانهٔ کانتینر کپی میکنند تا 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 backend:
pnpm test:docker:live-cli-backend(اسکریپت:scripts/test-live-cli-backend-docker.sh) -
آزمون دود چارچوب app-server مربوط به 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 بسته نیستند، زیرا tarball مربوط به npm شامل QA Lab نمیشود. -
آزمون دود زندهٔ Open WebUI:
pnpm test:docker:openwebui(اسکریپت:scripts/e2e/openwebui-docker.sh) -
جادوگر راهاندازی اولیه (TTY، داربستبندی کامل):
pnpm test:docker:onboard(اسکریپت:scripts/e2e/onboard-docker.sh) -
آزمون دود راهاندازی اولیه/کانال/عامل با tarball مربوط به Npm:
pnpm test:docker:npm-onboard-channel-agent، tarball بستهبندیشدهٔ OpenClaw را بهصورت سراسری در Docker نصب میکند، OpenAI را از طریق راهاندازی اولیهٔ ارجاع محیطی و همچنین Telegram را بهطور پیشفرض پیکربندی میکند، doctor را اجرا میکند و یک نوبت عامل شبیهسازیشدهٔ OpenAI را اجرا میکند. برای استفادهٔ مجدد از tarball ازپیشساختهشده از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 را پیکربندی میکند، یک نوبت عامل را اجرا میکند، Pluginهای خارجی را نصب/حذف نصب میکند، ClickClack را در برابر یک فیکسچر محلی پیکربندی میکند، پیامرسانی خروجی/ورودی را تأیید میکند، Gateway را بازراهاندازی میکند و doctor را اجرا میکند. -
آزمون دود راهاندازی اولیهٔ نوعدار انتشار:
pnpm test:docker:release-typed-onboardingبستهٔ tarballشده را نصب میکند،openclaw onboardرا از طریق یک TTY واقعی هدایت میکند، OpenAI را بهعنوان ارائهدهندهٔ env-ref پیکربندی میکند، تأیید میکند که کلید خام ذخیره نمیشود و یک نوبت عامل شبیهسازیشده را اجرا میکند. -
آزمون دود رسانه/حافظهٔ انتشار:
pnpm test:docker:release-media-memoryبستهٔ tarballشده را نصب میکند و درک تصویر از یک پیوست PNG، خروجی تولید تصویر سازگار با OpenAI، بازیابی جستوجوی حافظه و دوام بازیابی پس از بازراهاندازی Gateway را تأیید میکند. -
آزمون دود مسیر کاربر ارتقای انتشار:
pnpm test:docker:release-upgrade-user-journeyبهطور پیشفرض جدیدترین نسخهٔ پایهٔ منتشرشدهای را که از tarball نامزد قدیمیتر است نصب میکند، وضعیت ارائهدهنده/Plugin/ClickClack را روی بستهٔ منتشرشده پیکربندی میکند، به tarball نامزد ارتقا میدهد و سپس مسیر اصلی عامل/Plugin/کانال را دوباره اجرا میکند. اگر نسخهٔ پایهٔ منتشرشدهٔ قدیمیتری وجود نداشته باشد، نسخهٔ نامزد را دوباره استفاده میکند. نسخهٔ پایه را باOPENCLAW_RELEASE_UPGRADE_BASELINE_SPEC=openclaw@<version>بازنویسی کنید. -
آزمون دود بازار Plugin انتشار:
pnpm test:docker:release-plugin-marketplaceاز یک بازار فیکسچر محلی نصب میکند، Plugin نصبشده را بهروزرسانی میکند، آن را حذف نصب میکند و تأیید میکند که CLI مربوط به Plugin همراه با پاکسازی فرادادهٔ نصب ناپدید میشود. -
آزمون دود نصب Skill:
pnpm test:docker:skill-installبستهٔ tarballشدهٔ OpenClaw را بهصورت سراسری در Docker نصب میکند، نصب بایگانیهای بارگذاریشده را در پیکربندی غیرفعال میکند، slug فعلی Skill زندهٔ ClawHub را از جستوجو بهدست میآورد، آن را باopenclaw skills installنصب میکند و Skill نصبشده بههمراه فرادادهٔ مبدأ/قفل.clawhubرا تأیید میکند. -
آزمون دود تغییر کانال بهروزرسانی:
pnpm test:docker:update-channel-switchبستهٔ tarballشدهٔ OpenClaw را بهصورت سراسری در Docker نصب میکند، از بستهٔstableبه gitdevتغییر میدهد، ماندگاری کانال و عملکرد Plugin پس از بهروزرسانی را تأیید میکند، سپس به بستهٔstableبازمیگردد و وضعیت بهروزرسانی را بررسی میکند. -
آزمون دود دوام پس از ارتقا:
pnpm test:docker:upgrade-survivorبستهٔ tarballشدهٔ OpenClaw را روی یک فیکسچر کثیف کاربر قدیمی شامل عاملها، پیکربندی کانال، فهرستهای مجاز Plugin، وضعیت کهنهٔ وابستگی Plugin و فایلهای موجود فضای کاری/نشست نصب میکند. سپس بدون کلیدهای زندهٔ ارائهدهنده یا کانال، بهروزرسانی بسته و doctor غیرتعاملی را اجرا میکند، یک Gateway حلقهٔ بازگشتی را راهاندازی میکند و حفظ پیکربندی/وضعیت بههمراه بودجههای راهاندازی/وضعیت را بررسی میکند. -
آزمون دود دوام پس از ارتقای منتشرشده:
pnpm test:docker:published-upgrade-survivorبهطور پیشفرضopenclaw@latestرا نصب میکند، فایلهای واقعگرایانهٔ کاربر موجود را مقداردهی اولیه میکند، آن نسخهٔ پایه را با یک دستورالعمل فرمان تعبیهشده پیکربندی میکند، پیکربندی حاصل را اعتبارسنجی میکند، نصب منتشرشده را به tarball نامزد بهروزرسانی میکند، doctor غیرتعاملی را اجرا میکند،.artifacts/upgrade-survivor/summary.jsonرا مینویسد، سپس یک Gateway حلقهٔ بازگشتی را راهاندازی میکند و قصدهای پیکربندیشده، حفظ وضعیت، راهاندازی،/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برای ترمیم خودکار نصب Plugin خارجی OpenClaw است. Package Acceptance این موارد را بهصورتpublished_upgrade_survivor_baseline،published_upgrade_survivor_baselinesوpublished_upgrade_survivor_scenariosارائه میکند، توکنهای فرای نسخهٔ پایه مانندlast-stable-4یاall-since-2026.4.23را تفکیک میکند و Full Release Validation دروازهٔ بستهٔ آزمون ماندگاری انتشار را به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/را باOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:localاز یک تصویر Docker ساختهشده کپی کنید. -
آزمون دود Docker نصبکننده:
bash scripts/test-install-sh-docker.shیک کش npm را میان کانتینرهای root، بهروزرسانی و direct-npm خود بهاشتراک میگذارد. آزمون دود بهروزرسانی، پیش از ارتقا به tarball نامزد، بهطور پیشفرض npmlatestرا نسخهٔ پایهٔ پایدار در نظر میگیرد. آن را بهصورت محلی باOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22یا در GitHub با ورودیupdate_baseline_versionگردشکار Install Smoke بازنویسی کنید. بررسیهای نصبکنندهٔ غیر root یک کش npm ایزوله نگه میدارند تا ورودیهای کش متعلق به root رفتار نصب محلی کاربر را پنهان نکنند. برای استفادهٔ دوباره از کش root/update/direct-npm در اجرای مجدد محلی،OPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cacheرا تنظیم کنید. -
پایپلاین CI آزمون Install Smoke با
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1بهروزرسانی سراسری تکراری direct-npm را رد میکند؛ هنگامی که پوشش مستقیمnpm install -gلازم است، اسکریپت را بهصورت محلی بدون آن متغیر محیطی اجرا کنید. -
آزمون دود CLI حذف فضای کاری مشترک عاملها:
pnpm test:docker:agents-delete-shared-workspace(اسکریپت:scripts/e2e/agents-delete-shared-workspace-docker.sh) بهطور پیشفرض تصویر Dockerfile ریشه را میسازد، دو عامل را با یک فضای کاری در محیط خانگی ایزولهٔ کانتینر مقداردهی اولیه میکند،agents delete --jsonرا اجرا میکند و JSON معتبر بههمراه رفتار حفظ فضای کاری را تأیید میکند. تصویر install-smoke را باOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1دوباره استفاده کنید. -
شبکه و چرخهٔ عمر میزبان Gateway:
pnpm test:docker:gateway-network(اسکریپت:scripts/e2e/gateway-network-docker.sh) آزمون دود احراز هویت/سلامت WebSocket شبکهٔ محلی دوکانتینری را حفظ میکند، سپس از HTTP مدیریتی حلقهٔ بازگشتی برای اثبات حصارگذاری آمادهسازی، دسترسی کنترلی حفظشده، بازیابی از سرگیری و توقف/شروع آمادهشده در همان کانتینر استفاده میکند. بررسی بازراهاندازی باید پیش از انقضای اجارهٔ اصلی تکمیل شود، تأیید میکند که وضعیت تعلیق محلیِ فرایند است، درحالیکه پیکربندی ماندگار Gateway و هویت کانتینر باقی میمانند، و JSON زمانبندی فازها را بهصورت ماشینخوان منتشر میکند. -
آزمون دود snapshot پروتکل CDP مرورگر:
pnpm test:docker:browser-cdp-snapshot(اسکریپت:scripts/e2e/browser-cdp-snapshot-docker.sh) تصویر E2E منبع بههمراه یک لایهٔ Chromium را میسازد، Chromium را با CDP خام راهاندازی میکند،browser doctor --deepرا اجرا میکند و تأیید میکند که snapshotهای نقش CDP نشانیهای اینترنتی پیوندها، عناصر کلیکپذیر ارتقایافته با نشانگر، ارجاعهای iframe و فرادادهٔ قاب را پوشش میدهند. -
پسرفت استدلال حداقلی web_search در OpenAI Responses:
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) -
Pluginها (آزمون دود نصب/بهروزرسانی برای مسیر محلی،
file:، رجیستری npm با وابستگیهای بالاکشیدهشده، فرادادهٔ نادرست بستهٔ npm، ارجاعهای متحرک git، مجموعهٔ جامع ClawHub، بهروزرسانیهای بازار و فعالسازی/بازرسی بستهٔ Claude):pnpm test:docker:plugins(اسکریپت:scripts/e2e/plugins-docker.sh) برای رد کردن بلوک ClawHub،OPENCLAW_PLUGINS_E2E_CLAWHUB=0را تنظیم کنید یا جفت پیشفرض بسته/زماناجرای مجموعهٔ جامع را باOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECوOPENCLAW_PLUGINS_E2E_CLAWHUB_IDبازنویسی کنید. بدونOPENCLAW_CLAWHUB_URL/CLAWHUB_URL، آزمون از یک سرور فیکسچر محلی و محصور ClawHub استفاده میکند. -
آزمون دود بدون تغییر بهروزرسانی Plugin:
pnpm test:docker:plugin-update(اسکریپت:scripts/e2e/plugin-update-unchanged-docker.sh) -
آزمون دود ماتریس چرخهٔ عمر Plugin:
pnpm test:docker:plugin-lifecycle-matrixبستهٔ tarballشدهٔ OpenClaw را در یک کانتینر خالی نصب میکند، یک Plugin مبتنی بر npm نصب میکند، وضعیت فعال/غیرفعال را تغییر میدهد، آن را از طریق یک رجیستری محلی npm ارتقا و تنزل میدهد، کد نصبشده را حذف میکند و سپس تأیید میکند که حذف نصب همچنان وضعیت کهنه را حذف میکند و همزمان سنجههای RSS/CPU را برای هر فاز چرخهٔ عمر ثبت میکند. -
آزمون دود فرادادهٔ بارگذاری مجدد پیکربندی:
pnpm test:docker:config-reload(اسکریپت:scripts/e2e/config-reload-source-docker.sh) -
Pluginها:
pnpm test:docker:pluginsآزمون دود نصب/بهروزرسانی برای مسیر محلی،file:، رجیستری npm با وابستگیهای بالاکشیدهشده، ارجاعهای متحرک git، فیکسچرهای ClawHub، بهروزرسانیهای بازار و فعالسازی/بازرسی بستهٔ Claude را پوشش میدهد.pnpm test:docker:plugin-updateرفتار بهروزرسانی بدون تغییر برای Pluginهای نصبشده را پوشش میدهد.pnpm test:docker:plugin-lifecycle-matrixنصب، فعالسازی، غیرفعالسازی، ارتقا، تنزل و حذف نصب در نبود کد را برای Plugin مبتنی بر 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 به یک تصویر مشترک راهدور اشاره میکند، اسکریپتها در صورت نبود آن در محیط محلی، تصویر را دریافت میکنند. آزمونهای Docker مربوط به QR و نصبکننده، Dockerfileهای خود را نگه میدارند، زیرا رفتار بسته/نصب را اعتبارسنجی میکنند، نه زماناجرای مشترک برنامهٔ ساختهشده را.
اجراکنندههای Docker مدل زنده همچنین checkout فعلی را بهصورت فقطخواندنی
bind-mount میکنند و آن را در یک پوشهٔ کاری موقت داخل کانتینر قرار میدهند. این کار
تصویر زماناجرا را کمحجم نگه میدارد و درعینحال Vitest را دقیقاً روی
منبع/پیکربندی محلی شما اجرا میکند. مرحلهٔ آمادهسازی از کشهای بزرگ صرفاً محلی و خروجیهای
ساخت برنامه مانند .pnpm-store، .worktrees، __openclaw_vitest__ و
.build محلی برنامه یا پوشههای خروجی Gradle صرفنظر میکند تا اجرای زندهٔ Docker
دقایقی را صرف کپیکردن مصنوعات مختص دستگاه نکند. آنها همچنین
OPENCLAW_SKIP_CHANNELS=1 را تنظیم میکنند تا کاوشگرهای زندهٔ Gateway، workerهای واقعی کانال
Telegram/Discord/و غیره را داخل کانتینر راهاندازی نکنند.
test:docker:live-models همچنان pnpm test:live را اجرا میکند، بنابراین هنگامی که لازم است پوشش زندهٔ
Gateway را در آن مسیر Docker محدود یا مستثنا کنید، OPENCLAW_LIVE_GATEWAY_* را نیز
عبور دهید.
test:docker:openwebui یک آزمون دود سازگاری سطحبالاتر است: یک کانتینر
Gateway مربوط به OpenClaw را با endpointهای HTTP سازگار با OpenAI راهاندازی میکند،
یک کانتینر Open WebUI سنجاقشده را در برابر آن Gateway راهاندازی میکند، از طریق
Open WebUI وارد میشود، تأیید میکند که /api/models، openclaw/default را ارائه میدهد و سپس یک
درخواست گفتوگوی واقعی را از طریق پراکسی /api/chat/completions در Open WebUI ارسال میکند. برای بررسیهای پایپلاین CI مسیر انتشار که باید
پس از ورود به Open WebUI و کشف مدل متوقف شوند، بدون انتظار برای تکمیل مدل زنده،
OPENWEBUI_SMOKE_MODE=models را تنظیم کنید. اجرای نخست ممکن است بهطور محسوسی کندتر باشد، زیرا Docker شاید نیاز داشته باشد
تصویر Open WebUI را دریافت کند و Open WebUI نیز ممکن است لازم باشد
راهاندازی سرد خود را کامل کند. این مسیر به یک کلید قابلاستفادهٔ مدل زنده نیاز دارد که از طریق
محیط فرایند، نمایههای احراز هویت آمادهشده یا یک
OPENCLAW_PROFILE_FILE صریح ارائه میشود. اجراهای موفق یک payload کوچک 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/.openclawسوار میشودOPENCLAW_WORKSPACE_DIR=...(پیشفرض:~/.openclaw/workspace) که در/home/node/.openclaw/workspaceسوار میشودOPENCLAW_PROFILE_FILE=...که پیش از اجرای آزمونها سوار و منبعدهی میشودOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1برای تأیید اینکه فقط متغیرهای محیطی منبعدهیشده ازOPENCLAW_PROFILE_FILEاستفاده میشوند؛ با دایرکتوریهای موقت پیکربندی/فضای کاری و بدون سوارکردن احراز هویت CLI خارجیOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(پیشفرض:~/.cache/openclaw/docker-cli-tools، مگر اینکه اجرا از قبل از یک دایرکتوری اتصال CI/مدیریتشده استفاده کند) که برای نصبهای کششده CLI درون Docker در/home/node/.npm-globalسوار میشود- دایرکتوریها/فایلهای احراز هویت 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=...برای بازنویسی اعلان بررسی nonce که آزمون دود Open WebUI استفاده میکندOPENWEBUI_IMAGE=...برای بازنویسی برچسب تصویر سنجاقشده Open WebUI
بررسی سلامت مستندات
پس از ویرایش مستندات، بررسیهای مستندات را اجرا کنید: pnpm check:docs.
هنگامیکه به بررسی سرفصلهای درونصفحهای نیز نیاز دارید، اعتبارسنجی کامل لنگرهای Mintlify را اجرا کنید: pnpm docs:check-links:anchors.
رگرسیون آفلاین (ایمن برای CI)
اینها رگرسیونهای «پایپلاین واقعی» بدون ارائهدهندگان واقعی هستند:
- فراخوانی ابزار Gateway (OpenAI شبیهسازیشده، Gateway واقعی + حلقه عامل):
src/gateway/gateway.test.ts(مورد: «فراخوانی ابزار OpenAI شبیهسازیشده را بهصورت سرتاسری از طریق حلقه عامل Gateway اجرا میکند») - جادوگر Gateway (WS
wizard.start/wizard.next، نوشتن پیکربندی + اعمال احراز هویت):src/gateway/gateway.test.ts(مورد: «جادوگر را از طریق ws اجرا میکند و پیکربندی توکن احراز هویت را مینویسد»)
ارزیابیهای قابلیت اطمینان عامل (Skills)
از قبل چند آزمون ایمن برای CI داریم که مانند «ارزیابیهای قابلیت اطمینان عامل» عمل میکنند:
- فراخوانی ابزار شبیهسازیشده از طریق Gateway واقعی + حلقه عامل (
src/gateway/gateway.test.ts). - جریانهای سرتاسری جادوگر که سیمکشی نشست و اثرات پیکربندی را اعتبارسنجی میکنند (
src/gateway/gateway.test.ts).
مواردی که هنوز برای Skills وجود ندارند (به Skills مراجعه کنید):
- تصمیمگیری: وقتی Skills در اعلان فهرست میشوند، آیا عامل Skill درست را انتخاب میکند (یا از موارد نامرتبط اجتناب میکند)؟
- انطباق: آیا عامل پیش از استفاده،
SKILL.mdرا میخواند و مراحل/آرگومانهای الزامی را دنبال میکند؟ - قراردادهای گردشکار: سناریوهای چندنوبتی که ترتیب ابزارها، انتقال تاریخچه نشست و مرزهای جعبه شنی را بررسی میکنند.
ارزیابیهای آینده باید ابتدا قطعی بمانند:
- یک اجراکننده سناریو با استفاده از ارائهدهندگان شبیهسازیشده برای بررسی فراخوانی ابزارها + ترتیب، خواندن فایلهای Skill و سیمکشی نشست.
- یک مجموعه کوچک از سناریوهای متمرکز بر Skill (استفاده در برابر اجتناب، دروازهگذاری، تزریق اعلان).
- ارزیابیهای زنده اختیاری (با انتخاب صریح و محدودشده با متغیر محیطی) فقط پس از آمادهشدن مجموعه ایمن برای CI.
آزمونهای قرارداد (شکل Plugin و کانال)
آزمونهای قرارداد تأیید میکنند که هر Plugin و کانال ثبتشده با
قرارداد رابط خود مطابقت دارد. آنها روی همه Pluginهای کشفشده پیمایش میکنند و یک
مجموعه از بررسیهای شکل و رفتار را اجرا میکنند. مسیر واحد پیشفرض 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-core.* - رجیستری Plugin کانال، بارگذار و جزئیات داخلی مجوز نوشتن پیکربندی
راهنماهای چارچوب ثبت توزیع ورودی و محموله خروجی که این
مجموعهها استفاده میکنند، در داخل از طریق src/plugin-sdk/channel-contract-testing.ts
(مستثناشده از npm، نه یک زیرمسیر عمومی SDK) ارائه میشوند؛ هیچ فایل مستقلی با نام
inbound.contract.test.ts در این دایرکتوری وجود ندارد.
قراردادهای ارائهدهنده
در src/plugins/contracts/*.contract.test.ts قرار دارند. دستههای کنونی
شامل موارد زیر هستند:
- شکل - شکل مانیفست Plugin، API و خروجی زماناجرا
- ثبت Plugin (+ موازی) - موارد ثبت مانیفست
- مانیفست بسته - الزامات مانیفست بسته
- بارگذار - رفتار راهاندازی/جمعآوری بارگذار Plugin
- رجیستری - محتویات و جستوجوی رجیستری قرارداد Plugin
- ارائهدهندگان - رفتار مشترک ارائهدهنده در میان ارائهدهندگان بستهبندیشده، بهعلاوه ارائهدهندگان جستوجوی وب
- انتخاب احراز هویت - فراداده انتخاب احراز هویت و رفتار راهاندازی
- منسوخسازی کاتالوگ ارائهدهنده - فراداده کاتالوگ ارائهدهنده منسوخشده
- تفکیک انتخاب جادوگر، انتخابگر مدل جادوگر، گزینههای راهاندازی جادوگر - قراردادهای جادوگر راهاندازی ارائهدهنده
- ارائهدهنده جاسازی، ارائهدهنده جاسازی حافظه، ارائهدهنده واکشی وب، تبدیل متن به گفتار - قراردادهای ارائهدهنده ویژه قابلیت
- کنشهای نشست، پیوستهای نشست، فرافکنی ورودی نشست - قراردادهای وضعیت نشست تحت مالکیت Plugin
- نوبتهای زمانبندیشده - فراداده نوبت زمانبندیشده Plugin و محدودههای مهر زمانی
- قلابهای میزبان، چرخه حیات زمینه اجرا، اثرات جانبی واردکردن زماناجرا، اتصالهای زماناجرا - قراردادهای چرخه حیات میزبان/زماناجرای Plugin و مرزهای واردکردن
- وابستگیهای زماناجرای افزونه - جایگذاری وابستگی زماناجرا برای افزونهها
زمان اجرا
- پس از تغییر خروجیها یا زیرمسیرهای plugin-sdk
- پس از افزودن یا تغییر یک Plugin کانال یا ارائهدهنده
- پس از بازآرایی ثبت یا کشف Plugin
آزمونهای قرارداد در CI اجرا میشوند و به کلیدهای API واقعی نیاز ندارند.
افزودن رگرسیونها (راهنما)
هنگامیکه یک مشکل ارائهدهنده/مدل کشفشده در محیط زنده را رفع میکنید:
- در صورت امکان یک رگرسیون ایمن برای CI اضافه کنید (ارائهدهنده شبیهسازیشده/بدلی، یا ثبت تبدیل دقیق شکل درخواست)
- اگر ذاتاً فقط در محیط زنده رخ میدهد (محدودیت نرخ، سیاستهای احراز هویت)، آزمون زنده را محدود و با متغیرهای محیطی مبتنی بر انتخاب صریح نگه دارید
- ترجیحاً کوچکترین لایهای را هدف بگیرید که خطا را تشخیص میدهد:
- خطای تبدیل/بازپخش درخواست ارائهدهنده -> آزمون مستقیم مدلها
- خطای پایپلاین نشست/تاریخچه/ابزار Gateway -> آزمون دود زنده Gateway یا آزمون شبیهسازیشده Gateway ایمن برای CI
- محافظ پیمایش SecretRef:
src/secrets/exec-secret-ref-id-parity.test.tsبر اساس فراداده رجیستری (listSecretTargetRegistryEntries()) برای هر کلاس SecretRef یک هدف نمونه استخراج میکند و سپس بررسی میکند که شناسههای اجرای دارای بخش پیمایش رد میشوند.- اگر یک خانواده هدف SecretRef جدید
includeInPlanرا درsrc/secrets/target-registry-data.tsاضافه کردید،classifyTargetClassرا در آن آزمون بهروزرسانی کنید. آزمون عمداً برای شناسههای هدف طبقهبندینشده شکست میخورد تا کلاسهای جدید نتوانند بیسروصدا نادیده گرفته شوند.