Release and CI
Pengujian
-
Perangkat pengujian lengkap (suite, live, Docker): Pengujian
-
Validasi pembaruan dan paket plugin: Menguji pembaruan dan plugin
-
Urutan pengujian lokal rutin:
pnpm test:changeduntuk bukti Vitest bercakupan perubahan.pnpm test <path-or-filter>untuk satu file, direktori, atau target eksplisit.pnpm testhanya saat Anda sengaja memerlukan seluruh suite Vitest lokal.
-
pnpm test:force: Menghentikan proses gateway tertinggal yang memegang port kontrol default, lalu menjalankan seluruh suite Vitest dengan port gateway terisolasi agar pengujian server tidak bertabrakan dengan instans yang sedang berjalan. Gunakan ini saat proses gateway sebelumnya membiarkan port 18789 terpakai. -
pnpm test:coverage: Menjalankan suite unit dengan cakupan V8 (melaluivitest.unit.config.ts). Ini adalah gerbang cakupan lane unit default, bukan cakupan semua file seluruh repo. Ambangnya adalah 70% baris/fungsi/pernyataan dan 55% cabang. Karenacoverage.allbernilai false dan lane default membatasi cakupan mencakup pengujian unit non-cepat dengan file sumber saudara, gerbang ini mengukur sumber yang dimiliki lane ini, bukan setiap impor transitif yang kebetulan dimuat. -
pnpm test:coverage:changed: Menjalankan cakupan unit hanya untuk file yang berubah sejakorigin/main. -
pnpm test:changed: proses pengujian perubahan cerdas yang murah. Ini menjalankan target presisi dari perubahan langsung pada pengujian, file saudara*.test.ts, pemetaan sumber eksplisit, dan grafik impor lokal. Perubahan luas/konfigurasi/paket dilewati kecuali dipetakan ke pengujian presisi. -
OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed: proses pengujian perubahan luas eksplisit. Gunakan saat perubahan harness/konfigurasi/paket pengujian harus fallback ke perilaku pengujian perubahan Vitest yang lebih luas. -
pnpm changed:lanes: menampilkan lane arsitektural yang dipicu oleh diff terhadaporigin/main. -
pnpm check:changed: secara default mendelegasikan ke Crabbox/Testbox di luar CI, lalu menjalankan gerbang pemeriksaan perubahan cerdas untuk diff terhadaporigin/maindi dalam child jarak jauh. Ini menjalankan typecheck, lint, dan perintah guard untuk lane arsitektural yang terdampak, tetapi tidak menjalankan pengujian Vitest. Gunakanpnpm test:changedataupnpm test <target>eksplisit untuk bukti pengujian. -
Worktree Codex dan checkout tertaut/sparse: hindari
pnpm test*,pnpm check*, danpnpm crabbox:runlokal langsung kecuali Anda telah memverifikasi bahwa pnpm tidak akan merekonsiliasi dependensi. Untuk bukti file eksplisit yang sangat kecil, gunakannode scripts/run-vitest.mjs <path-or-filter>; untuk gerbang perubahan atau bukti luas, gunakannode scripts/crabbox-wrapper.mjs run --provider blacksmith-testbox ... -- env OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 corepack pnpm check:changedagar pnpm berjalan di dalam Testbox. -
Bukti Testbox-melalui-Crabbox: gunakan
exitCodefinal wrapper dan JSON timing sebagai hasil perintah. Proses Blacksmith GitHub Actions yang didelegasikan dapat menampilkancancelledsetelah perintah SSH berhasil karena Testbox dihentikan dari luar aksi keepalive; verifikasi ringkasan wrapper dan output perintah sebelum memperlakukannya sebagai kegagalan pengujian. -
OPENCLAW_HEAVY_CHECK_LOCK_SCOPE=worktree <local-heavy-check command>: menjaga serialisasi pemeriksaan berat tetap di dalam worktree saat ini, bukan di direktori umum Git untuk perintah sepertipnpm check:changeddanpnpm test ...bertarget. Gunakan hanya pada host lokal berkapasitas tinggi saat Anda sengaja menjalankan pemeriksaan independen di beberapa worktree tertaut. -
pnpm test: merutekan target file/direktori eksplisit melalui lane Vitest bercakupan. Proses tanpa target adalah bukti suite penuh: proses ini menggunakan grup shard tetap, diperluas ke konfigurasi leaf untuk eksekusi paralel lokal, dan mencetak fanout shard lokal yang diharapkan sebelum dimulai. Grup ekstensi selalu diperluas ke konfigurasi shard per ekstensi, bukan satu proses proyek root raksasa. -
Proses wrapper pengujian diakhiri dengan ringkasan singkat
[test] passed|failed|skipped ... in .... Baris durasi milik Vitest tetap menjadi detail per shard. -
Status pengujian bersama OpenClaw: gunakan
src/test-utils/openclaw-test-state.tsdari Vitest saat pengujian memerlukanHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH, fixture konfigurasi, workspace, direktori agent, atau penyimpanan profil auth yang terisolasi. -
pnpm test:env-mutations:report: laporan non-pemblokir tentang pengujian dan harness yang secara langsung mengubahHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH,OPENCLAW_WORKSPACE_DIR, atau kunci env OpenClaw terkait. Gunakan untuk menemukan kandidat migrasi ke helper status pengujian bersama. -
E2E UI Kontrol tiruan: gunakan
pnpm test:ui:e2euntuk lane Vitest + Playwright yang memulai UI Kontrol Vite dan mengendalikan halaman Chromium nyata terhadap Gateway WebSocket tiruan. Pengujian berada diui/src/**/*.e2e.test.ts; mock dan kontrol bersama berada diui/src/test-helpers/control-ui-e2e.ts.pnpm test:e2emencakup lane ini. Di worktree Codex, pilihnode scripts/run-vitest.mjs run --config test/vitest/vitest.ui-e2e.config.ts --configLoader runner ui/src/ui/e2e/chat-flow.e2e.test.tsuntuk bukti bertarget kecil setelah dependensi terpasang, atau Testbox/Crabbox untuk bukti GUI yang lebih luas. -
Helper E2E proses: gunakan
test/helpers/openclaw-test-instance.tssaat pengujian E2E level proses Vitest memerlukan Gateway yang berjalan, env CLI, tangkapan log, dan pembersihan di satu tempat. -
Pengujian PTY TUI: gunakan
node scripts/run-vitest.mjs run --config test/vitest/vitest.tui-pty.config.tsuntuk lane PTY backend palsu yang cepat. GunakanOPENCLAW_TUI_PTY_INCLUDE_LOCAL=1ataupnpm tui:pty:test:watch --mode localuntuk smoketui --localyang lebih lambat, yang hanya memock endpoint model eksternal. Assert teks terlihat yang stabil atau panggilan fixture, bukan snapshot ANSI mentah. -
Helper E2E Docker/Bash: lane yang men-source
scripts/lib/docker-e2e-image.shdapat meneruskandocker_e2e_test_state_shell_b64 <label> <scenario>ke dalam kontainer dan mendekodenya denganscripts/lib/openclaw-e2e-instance.sh; skrip multi-home dapat meneruskandocker_e2e_test_state_function_b64dan memanggilopenclaw_test_state_create <label> <scenario>di setiap flow. Pemanggil level lebih rendah dapat menggunakanscripts/lib/openclaw-test-state.mjs shell --label <name> --scenario <name>untuk snippet shell dalam kontainer, ataunode scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --jsonuntuk file env host yang dapat di-source.--sebelumcreatemencegah runtime Node yang lebih baru memperlakukan--env-filesebagai flag Node. Lane Docker/Bash yang meluncurkan Gateway dapat men-sourcescripts/lib/openclaw-e2e-instance.shdi dalam kontainer untuk resolusi entrypoint, startup OpenAI tiruan, peluncuran Gateway foreground/background, probe readiness, ekspor env status, dump log, dan pembersihan proses. -
Proses shard penuh, ekstensi, dan include-pattern memperbarui data timing lokal di
.artifacts/vitest-shard-timings.json; proses seluruh konfigurasi berikutnya menggunakan timing tersebut untuk menyeimbangkan shard lambat dan cepat. Shard CI include-pattern menambahkan nama shard ke kunci timing, sehingga timing shard terfilter tetap terlihat tanpa mengganti data timing seluruh konfigurasi. SetelOPENCLAW_TEST_PROJECTS_TIMINGS=0untuk mengabaikan artefak timing lokal. -
File pengujian
plugin-sdkdancommandsterpilih kini dirutekan melalui lane ringan khusus yang hanya mempertahankantest/setup.ts, sementara kasus berat runtime tetap berada di lane yang sudah ada. -
File sumber dengan pengujian saudara dipetakan ke saudara tersebut sebelum fallback ke glob direktori yang lebih luas. Perubahan helper di bawah
src/channels/plugins/contracts/test-helpers,src/plugin-sdk/test-helpers, dansrc/plugins/contractsmenggunakan grafik impor lokal untuk menjalankan pengujian yang mengimpor, bukan menjalankan luas setiap shard saat jalur dependensi presisi. -
auto-replykini juga dibagi menjadi tiga konfigurasi khusus (core,top-level,reply) agar harness reply tidak mendominasi pengujian status/token/helper top-level yang lebih ringan. -
Konfigurasi dasar Vitest kini default ke
pool: "threads"danisolate: false, dengan runner non-terisolasi bersama diaktifkan di seluruh konfigurasi repo. -
pnpm test:channelsmenjalankanvitest.channels.config.ts. -
pnpm test:extensionsdanpnpm test extensionsmenjalankan semua shard ekstensi/Plugin. Plugin channel berat, Plugin browser, dan OpenAI berjalan sebagai shard khusus; grup Plugin lain tetap dibatch. Gunakanpnpm test extensions/<id>untuk satu lane Plugin bundled. -
pnpm test:perf:imports: mengaktifkan pelaporan durasi impor + perincian impor Vitest, sambil tetap menggunakan perutean lane bercakupan untuk target file/direktori eksplisit. -
pnpm test:perf:imports:changed: profiling impor yang sama, tetapi hanya untuk file yang berubah sejakorigin/main. -
pnpm test:perf:changed:bench -- --ref <git-ref>membenchmark jalur mode perubahan yang dirutekan terhadap proses proyek root native untuk diff git committed yang sama. -
pnpm test:perf:changed:bench -- --worktreemembenchmark set perubahan worktree saat ini tanpa commit terlebih dahulu. -
pnpm test:perf:profile:main: menulis profil CPU untuk thread utama Vitest (.artifacts/vitest-main-profile). -
pnpm test:perf:profile:runner: menulis profil CPU + heap untuk runner unit (.artifacts/vitest-runner-profile). -
pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json: menjalankan setiap konfigurasi leaf Vitest suite penuh secara serial dan menulis data durasi berkelompok plus artefak JSON/log per konfigurasi. Agent Kinerja Pengujian menggunakan ini sebagai baseline sebelum mencoba perbaikan pengujian lambat. -
pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json: membandingkan laporan berkelompok setelah perubahan yang berfokus pada kinerja. -
pnpm test:docker:timings <summary.json>memeriksa lane Docker lambat setelah proses semua Docker; gunakanpnpm test:docker:rerun <run-id|summary.json|failures.json>untuk mencetak perintah rerun bertarget murah dari artefak yang sama. -
Integrasi Gateway: ikut serta melalui
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm testataupnpm test:gateway. -
pnpm test:e2e: Menjalankan agregat E2E repo: pengujian smoke end-to-end gateway plus lane E2E browser tiruan UI Kontrol. -
pnpm test:e2e:gateway: Menjalankan pengujian smoke end-to-end gateway (pemasangan multi-instans WS/HTTP/node). Default kethreads+isolate: falsedengan worker adaptif divitest.e2e.config.ts; sesuaikan denganOPENCLAW_E2E_WORKERS=<n>dan setelOPENCLAW_E2E_VERBOSE=1untuk log verbose. -
pnpm test:live: Menjalankan pengujian live provider (minimax/zai). Memerlukan kunci API danLIVE=1(atau*_LIVE_TEST=1khusus provider) agar tidak dilewati. -
pnpm test:docker:all: Membangun image live-test bersama, mengemas OpenClaw sekali sebagai tarball npm, membangun/menggunakan ulang image runner Node/Git polos plus image fungsional yang menginstal tarball tersebut ke/app, lalu menjalankan jalur smoke Docker denganOPENCLAW_SKIP_DOCKER_BUILD=1melalui penjadwal berbobot. Image polos (OPENCLAW_DOCKER_E2E_BARE_IMAGE) digunakan untuk jalur installer/update/plugin-dependency; jalur tersebut memasang tarball yang sudah dibangun sebelumnya alih-alih menggunakan sumber repo yang disalin. Image fungsional (OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE) digunakan untuk jalur fungsionalitas aplikasi terbangun normal.scripts/package-openclaw-for-docker.mjsadalah pengemas paket lokal/CI tunggal dan memvalidasi tarball plusdist/postinstall-inventory.jsonsebelum Docker mengonsumsinya. Definisi jalur Docker berada discripts/lib/docker-e2e-scenarios.mjs; logika perencana berada discripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsmengeksekusi rencana yang dipilih.node scripts/test-docker-all.mjs --plan-jsonmengeluarkan rencana CI milik penjadwal untuk jalur terpilih, jenis image, kebutuhan paket/live-image, skenario state, dan pemeriksaan kredensial tanpa membangun atau menjalankan Docker.OPENCLAW_DOCKER_ALL_PARALLELISM=<n>mengontrol slot proses dan default-nya 10;OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM=<n>mengontrol kumpulan ekor yang sensitif terhadap provider dan default-nya 10. Batas jalur berat default keOPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=5, danOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; batas provider default ke satu jalur berat per provider melaluiOPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT=4,OPENCLAW_DOCKER_ALL_LIVE_CODEX_LIMIT=4, danOPENCLAW_DOCKER_ALL_LIVE_GEMINI_LIMIT=4. GunakanOPENCLAW_DOCKER_ALL_WEIGHT_LIMITatauOPENCLAW_DOCKER_ALL_DOCKER_LIMITuntuk host yang lebih besar. Jika satu jalur melampaui bobot efektif atau batas resource pada host dengan paralelisme rendah, jalur itu tetap dapat mulai dari kumpulan kosong dan akan berjalan sendiri sampai melepas kapasitas. Awal jalur diberi jeda bertahap 2 detik secara default untuk menghindari lonjakan pembuatan pada daemon Docker lokal; timpa denganOPENCLAW_DOCKER_ALL_START_STAGGER_MS=<ms>. Runner melakukan preflight Docker secara default, membersihkan kontainer E2E OpenClaw yang basi, mengeluarkan status jalur aktif setiap 30 detik, berbagi cache alat CLI provider antarjalur yang kompatibel, mencoba ulang kegagalan provider live sementara sekali secara default (OPENCLAW_DOCKER_ALL_LIVE_RETRIES=<n>), dan menyimpan waktu jalur di.artifacts/docker-tests/lane-timings.jsonuntuk pengurutan terlama-dahulu pada run berikutnya. GunakanOPENCLAW_DOCKER_ALL_DRY_RUN=1untuk mencetak manifes jalur tanpa menjalankan Docker,OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS=<ms>untuk menyesuaikan output status, atauOPENCLAW_DOCKER_ALL_TIMINGS=0untuk menonaktifkan penggunaan ulang timing. GunakanOPENCLAW_DOCKER_ALL_LIVE_MODE=skiphanya untuk jalur deterministik/lokal atauOPENCLAW_DOCKER_ALL_LIVE_MODE=onlyhanya untuk jalur provider live; alias paketnya adalahpnpm test:docker:local:alldanpnpm test:docker:live:all. Mode khusus live menggabungkan jalur live utama dan ekor ke dalam satu kumpulan terlama-dahulu sehingga bucket provider dapat mengemas pekerjaan Claude, Codex, dan Gemini bersama-sama. Runner berhenti menjadwalkan jalur kumpulan baru setelah kegagalan pertama kecualiOPENCLAW_DOCKER_ALL_FAIL_FAST=0disetel, dan setiap jalur memiliki timeout fallback 120 menit yang dapat ditimpa denganOPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS; jalur live/ekor tertentu menggunakan batas per-jalur yang lebih ketat. Perintah setup Docker backend CLI memiliki timeout sendiri melaluiOPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS(default 180). Log per-jalur,summary.json,failures.json, dan timing fase ditulis di bawah.artifacts/docker-tests/<run-id>/; gunakanpnpm test:docker:timings <summary.json>untuk memeriksa jalur lambat danpnpm test:docker:rerun <run-id|summary.json|failures.json>untuk mencetak perintah rerun tertarget yang murah. -
pnpm test:docker:browser-cdp-snapshot: Membangun kontainer E2E sumber berbasis Chromium, memulai CDP mentah plus Gateway terisolasi, menjalankanbrowser doctor --deep, dan memverifikasi snapshot peran CDP mencakup URL tautan, elemen dapat diklik yang dipromosikan kursor, referensi iframe, dan metadata frame. -
pnpm test:docker:skill-install: Menginstal tarball OpenClaw yang dikemas di runner Docker polos, menonaktifkanskills.install.allowUploadedArchives, me-resolve slug skill saat ini dari pencarian ClawHub live, menginstalnya melaluiopenclaw skills install, dan memverifikasiSKILL.md,.clawhub/origin.json,.clawhub/lock.json, sertaskills info --json. -
Probe Docker live backend CLI dapat dijalankan sebagai jalur terfokus, misalnya
pnpm test:docker:live-cli-backend:claude,pnpm test:docker:live-cli-backend:claude:resume, ataupnpm test:docker:live-cli-backend:claude:mcp. Gemini memiliki alias:resumedan:mcpyang sesuai. -
pnpm test:docker:openwebui: Memulai OpenClaw + Open WebUI dalam Docker, masuk melalui Open WebUI, memeriksa/api/models, lalu menjalankan chat terproksi nyata melalui/api/chat/completions. Memerlukan kunci model live yang dapat digunakan, menarik image Open WebUI eksternal, dan tidak diharapkan stabil untuk CI seperti rangkaian unit/e2e normal. -
pnpm test:docker:mcp-channels: Memulai kontainer Gateway ber-seed dan kontainer klien kedua yang menjalankanopenclaw mcp serve, lalu memverifikasi penemuan percakapan yang dirutekan, pembacaan transkrip, metadata lampiran, perilaku antrean event live, perutean pengiriman keluar, serta notifikasi channel + izin bergaya Claude melalui bridge stdio nyata. Asersi notifikasi Claude membaca frame MCP stdio mentah secara langsung sehingga smoke mencerminkan apa yang benar-benar dihasilkan bridge. -
pnpm test:docker:upgrade-survivor: Menginstal tarball OpenClaw yang dikemas di atas fixture pengguna lama yang kotor, menjalankan update paket plus doctor non-interaktif tanpa kunci provider atau channel live, lalu memulai Gateway loopback dan memeriksa bahwa agen, konfigurasi channel, allowlist plugin, file workspace/session, state dependensi plugin legacy yang basi, startup, dan status RPC tetap bertahan. -
pnpm test:docker:published-upgrade-survivor: Menginstalopenclaw@latestsecara default, menanam file pengguna yang sudah ada secara realistis tanpa kunci provider atau channel live, mengonfigurasi baseline tersebut dengan resep perintahopenclaw config setbawaan, memperbarui instalasi terpublikasi itu ke tarball OpenClaw yang dikemas, menjalankan doctor non-interaktif, menulis.artifacts/upgrade-survivor/summary.json, lalu memulai Gateway loopback dan memeriksa bahwa intent yang dikonfigurasi, file workspace/session, konfigurasi plugin basi dan state dependensi legacy, startup,/healthz,/readyz, serta status RPC tetap bertahan atau diperbaiki dengan bersih. Timpa satu baseline denganOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, perluas matriks lokal persis denganOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECSsepertiopenclaw@2026.5.2 openclaw@2026.4.23 openclaw@2026.4.15, atau tambahkan fixture skenario denganOPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues; set reported-issues mencakupconfigured-plugin-installsuntuk memverifikasi plugin OpenClaw eksternal yang dikonfigurasi diinstal otomatis selama upgrade danstale-source-plugin-shadowuntuk mencegah bayangan plugin khusus sumber merusak startup. Package Acceptance mengeksposnya sebagaipublished_upgrade_survivor_baseline,published_upgrade_survivor_baselines, danpublished_upgrade_survivor_scenarios, serta me-resolve token baseline meta sepertilast-stable-4atauall-since-2026.4.23sebelum menyerahkan spesifikasi paket persis ke jalur Docker. -
pnpm test:docker:update-migration: Menjalankan harness published-upgrade survivor dalam skenarioplugin-deps-cleanupyang berat pembersihan, dimulai dariopenclaw@2026.4.23secara default. WorkflowUpdate Migrationterpisah memperluas jalur ini denganbaselines=all-since-2026.4.23sehingga setiap paket stabil terpublikasi mulai.23dan seterusnya diperbarui ke kandidat dan membuktikan pembersihan dependensi plugin yang dikonfigurasi di luar Full Release CI. -
pnpm test:docker:plugins: Menjalankan smoke install/update untuk path lokal,file:, paket registry npm dengan dependensi yang di-hoist, ref git bergerak, fixture ClawHub, update marketplace, serta enable/inspect bundel Claude.
Gate PR lokal
Untuk pemeriksaan land/gate PR lokal, jalankan:
pnpm check:changedpnpm checkpnpm check:test-typespnpm buildpnpm testpnpm check:docs
Jika pnpm test flake pada host yang sedang terbebani, jalankan ulang sekali sebelum menganggapnya sebagai regresi, lalu isolasi dengan pnpm test <path/to/test>. Untuk host dengan memori terbatas, gunakan:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed
Benchmark latensi model (kunci lokal)
Skrip: scripts/bench-model.ts
Penggunaan:
pnpm tsx scripts/bench-model.ts --runs 10- Env opsional:
MINIMAX_API_KEY,MINIMAX_BASE_URL,MINIMAX_MODEL,ANTHROPIC_API_KEY - Prompt default: "Balas dengan satu kata: ok. Tanpa tanda baca atau teks tambahan."
Jalankan terakhir (2025-12-31, 20 run):
- minimax median 1279ms (min 1114, maks 2431)
- opus median 2454ms (min 1224, maks 3170)
Benchmark startup CLI
Skrip: scripts/bench-cli-startup.ts
Penggunaan:
pnpm test:startup:benchpnpm test:startup:bench:smokepnpm test:startup:bench:savepnpm test:startup:bench:updatepnpm test:startup:bench:checkpnpm tsx scripts/bench-cli-startup.tspnpm tsx scripts/bench-cli-startup.ts --runs 12pnpm tsx scripts/bench-cli-startup.ts --preset realpnpm tsx scripts/bench-cli-startup.ts --preset real --case status --case gatewayStatus --runs 3pnpm tsx scripts/bench-cli-startup.ts --preset real --case tasksJson --case tasksListJson --case tasksAuditJson --runs 3pnpm tsx scripts/bench-cli-startup.ts --entry openclaw.mjs --entry-secondary dist/entry.js --preset allpnpm tsx scripts/bench-cli-startup.ts --preset all --output .artifacts/cli-startup-bench-all.jsonpnpm tsx scripts/bench-cli-startup.ts --preset real --case gatewayStatusJson --output .artifacts/cli-startup-bench-smoke.jsonpnpm tsx scripts/bench-cli-startup.ts --preset real --cpu-prof-dir .artifacts/cli-cpupnpm tsx scripts/bench-cli-startup.ts --json
Preset:
startup:--version,--help,health,health --json,status --json,statusreal:health,status,status --json,sessions,sessions --json,tasks --json,tasks list --json,tasks audit --json,agents list --json,gateway status,gateway status --json,gateway health --json,config get gateway.portall: kedua preset
Output mencakup sampleCount, rata-rata, p50, p95, min/maks, distribusi exit-code/sinyal, dan ringkasan RSS maks untuk setiap perintah. --cpu-prof-dir / --heap-prof-dir opsional menulis profil V8 per run sehingga pengukuran waktu dan penangkapan profil memakai harness yang sama.
Konvensi output tersimpan:
pnpm test:startup:bench:smokemenulis artefak smoke tertarget di.artifacts/cli-startup-bench-smoke.jsonpnpm test:startup:bench:savemenulis artefak suite penuh di.artifacts/cli-startup-bench-all.jsonmenggunakanruns=5danwarmup=1pnpm test:startup:bench:updatemenyegarkan fixture baseline yang di-check-in ditest/fixtures/cli-startup-bench.jsonmenggunakanruns=5danwarmup=1
Fixture yang di-check-in:
test/fixtures/cli-startup-bench.json- Segarkan dengan
pnpm test:startup:bench:update - Bandingkan hasil saat ini dengan fixture memakai
pnpm test:startup:bench:check
Benchmark startup Gateway
Skrip: scripts/bench-gateway-startup.ts
Benchmark default memakai entri CLI hasil build di dist/entry.js; jalankan
pnpm build sebelum memakai perintah package-script. Untuk mengukur runner
sumber sebagai gantinya, berikan --entry scripts/run-node.mjs dan pisahkan
hasil tersebut dari baseline entri hasil build.
Penggunaan:
pnpm test:startup:gateway -- --runs 5 --warmup 1pnpm test:startup:gateway -- --case default --runs 10 --warmup 1pnpm test:startup:gateway -- --case skipChannels --case fiftyPlugins --runs 5node --import tsx scripts/bench-gateway-startup.ts --case default --runs 5 --output .artifacts/gateway-startup.jsonnode --import tsx scripts/bench-gateway-startup.ts --case default --runs 3 --cpu-prof-dir .artifacts/gateway-startup-cpu
ID kasus:
default: startup Gateway normal.skipChannels: startup Gateway dengan startup channel dilewati.oneInternalHook: satu hook internal terkonfigurasi.allInternalHooks: semua hook internal.fiftyPlugins: 50 Plugin manifes.fiftyStartupLazyPlugins: 50 Plugin manifes startup-lazy.
Output mencakup output proses pertama, /healthz, /readyz, waktu log HTTP listen,
waktu log Gateway ready, waktu CPU, rasio inti CPU, RSS maks, heap, metrik trace
startup, delay event-loop, dan metrik detail tabel lookup Plugin. Skrip
mengaktifkan OPENCLAW_GATEWAY_STARTUP_TRACE=1 di lingkungan Gateway anak.
Baca /healthz sebagai liveness: server HTTP dapat merespons. Baca /readyz sebagai
readiness yang dapat digunakan: sidecar Plugin startup, channel, dan pekerjaan
post-attach yang kritis untuk ready sudah selesai. Hook startup Gateway dikirim
secara asinkron dan bukan bagian dari jaminan readiness. Waktu log ready adalah
timestamp log ready internal Gateway; ini berguna untuk atribusi sisi proses
tetapi bukan pengganti probe eksternal /readyz.
Gunakan output JSON atau --output saat membandingkan perubahan. Gunakan --cpu-prof-dir hanya
setelah output trace mengarah ke pekerjaan import, compile, atau CPU-bound yang tidak dapat
dijelaskan hanya dari timing fase. Jangan bandingkan hasil runner sumber dengan
hasil dist/entry.js hasil build sebagai baseline yang sama.
Benchmark restart Gateway
Skrip: scripts/bench-gateway-restart.ts
Benchmark restart hanya didukung di macOS dan Linux. Benchmark ini memakai SIGUSR1 untuk restart dalam proses dan langsung gagal di Windows.
Benchmark default memakai entri CLI hasil build di dist/entry.js; jalankan
pnpm build sebelum memakai perintah package-script. Untuk mengukur runner
sumber sebagai gantinya, berikan --entry scripts/run-node.mjs dan pisahkan
hasil tersebut dari baseline entri hasil build.
Penggunaan:
pnpm test:restart:gateway -- --case skipChannels --runs 1 --restarts 5pnpm test:restart:gateway -- --case default --runs 3 --restarts 3 --warmup 1pnpm test:restart:gateway -- --case skipChannelsAcpxProbe --case skipChannelsNoAcpxProbe --runs 1 --restarts 5node --import tsx scripts/bench-gateway-restart.ts --case fiftyPlugins --runs 1 --restarts 5 --output .artifacts/gateway-restart.jsonnode --import tsx scripts/bench-gateway-restart.ts --json
ID kasus:
skipChannels: restart dengan channel dilewati.skipChannelsAcpxProbe: restart dengan channel dilewati dan probe startup ACPX aktif.skipChannelsNoAcpxProbe: restart dengan channel dilewati dan probe startup ACPX nonaktif.default: restart normal.fiftyPlugins: restart dengan 50 Plugin manifes.
Output mencakup /healthz berikutnya, /readyz berikutnya, downtime, timing ready restart,
CPU, RSS, metrik trace startup untuk proses pengganti, dan metrik trace restart
untuk penanganan sinyal, drain active-work, fase close, start berikutnya, timing ready,
dan snapshot memori. Skrip mengaktifkan
OPENCLAW_GATEWAY_STARTUP_TRACE=1 dan OPENCLAW_GATEWAY_RESTART_TRACE=1 di lingkungan
Gateway anak.
Gunakan benchmark ini saat perubahan menyentuh pensinyalan restart, handler close,
startup-after-restart, shutdown sidecar, handoff layanan, atau readiness setelah
restart. Mulai dengan skipChannels saat mengisolasi mekanika Gateway dari startup
channel. Gunakan default atau kasus berat Plugin hanya setelah kasus sempit menjelaskan
alur restart.
Metrik trace adalah petunjuk atribusi, bukan vonis. Perubahan restart harus
dinilai dari beberapa sampel, span owner yang cocok, perilaku /healthz dan /readyz,
serta kontrak restart yang terlihat pengguna.
E2E onboarding (Docker)
Docker bersifat opsional; ini hanya diperlukan untuk smoke test onboarding terkontainerisasi.
Alur cold-start penuh dalam kontainer Linux bersih:
scripts/e2e/onboard-docker.shSkrip ini menjalankan wizard interaktif melalui pseudo-tty, memverifikasi file config/workspace/session, lalu memulai gateway dan menjalankan openclaw health.
Smoke impor QR (Docker)
Memastikan helper runtime QR terpelihara dimuat di runtime Docker Node yang didukung (Node 24 default, Node 22 kompatibel):
pnpm test:docker:qr