Release and CI
Тести
-
Повний набір для тестування (набори тестів, live, Docker): Тестування
-
Перевірка оновлень і пакетів Plugin: Тестування оновлень і Plugin
-
Звичайний порядок локального тестування:
pnpm test:changedдля Vitest-доказу в межах зміненої області.pnpm test <path-or-filter>для одного файлу, каталогу або явної цілі.pnpm testлише коли навмисно потрібен повний локальний набір Vitest.
-
pnpm test:force: завершує будь-який завислий процес gateway, що утримує типовий контрольний порт, а потім запускає повний набір Vitest з ізольованим портом gateway, щоб серверні тести не конфліктували із запущеним екземпляром. Використовуйте це, коли попередній запуск gateway залишив порт 18789 зайнятим. -
pnpm test:coverage: запускає модульний набір із покриттям V8 (черезvitest.unit.config.ts). Це coverage gate для типової модульної смуги, а не покриття всіх файлів усього репозиторію. Пороги становлять 70% для рядків/функцій/інструкцій і 55% для гілок. Оскількиcoverage.allмає значення false, а типова смуга обмежує включення покриття нешвидкими модульними тестами із сусідніми вихідними файлами, gate вимірює вихідний код, що належить цій смузі, замість кожного транзитивного імпорту, який випадково завантажується. -
pnpm test:coverage:changed: запускає модульне покриття лише для файлів, змінених відносноorigin/main. -
pnpm test:changed: дешевий розумний запуск змінених тестів. Він запускає точні цілі з прямих змін тестів, сусідніх файлів*.test.ts, явних зіставлень вихідного коду та локального графа імпортів. Широкі зміни конфігурації/пакетів пропускаються, якщо вони не зіставляються з точними тестами. -
OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed: явний широкий запуск змінених тестів. Використовуйте його, коли зміна тестового harness/конфігурації/пакета має повертатися до ширшої поведінки Vitest для змінених тестів. -
pnpm changed:lanes: показує архітектурні смуги, спрацьовані diff відносноorigin/main. -
pnpm check:changed: поза CI типово делегує до Crabbox/Testbox, а потім запускає розумний changed check gate для diff відносноorigin/mainвсередині віддаленої дочірньої задачі. Він запускає typecheck, lint і guard-команди для зачеплених архітектурних смуг, але не запускає тести Vitest. Використовуйтеpnpm test:changedабо явнийpnpm test <target>для тестового доказу. -
Робочі дерева Codex і linked/sparse checkouts: уникайте прямих локальних
pnpm test*,pnpm check*іpnpm crabbox:run, якщо ви не перевірили, що pnpm не виконуватиме reconciliation залежностей. Для крихітного доказу з явним файлом використовуйтеnode scripts/run-vitest.mjs <path-or-filter>; для changed gates або широкого доказу використовуйтеnode scripts/crabbox-wrapper.mjs run --provider blacksmith-testbox ... -- env OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 corepack pnpm check:changed, щоб pnpm виконувався всередині Testbox. -
Доказ Testbox через Crabbox: використовуйте фінальні
exitCodeі timing JSON з wrapper як результат команди. Делегований запуск Blacksmith GitHub Actions може показатиcancelledпісля успішної SSH-команди, бо Testbox зупинено ззовні keepalive action; перевірте підсумок wrapper і вивід команди, перш ніж вважати це помилкою тесту. -
OPENCLAW_HEAVY_CHECK_LOCK_SCOPE=worktree <local-heavy-check command>: утримує серіалізацію heavy-check всередині поточного робочого дерева замість спільного каталогу Git для команд на кшталтpnpm check:changedі таргетованогоpnpm test .... Використовуйте це лише на локальних хостах високої потужності, коли навмисно запускаєте незалежні перевірки в linked worktrees. -
pnpm test: маршрутизує явні файлові/каталожні цілі через scoped Vitest lanes. Нецільові запуски є доказом повного набору: вони використовують фіксовані shard-групи, розгортаються до leaf configs для локального паралельного виконання та друкують очікуваний локальний shard fanout перед стартом. Група розширень завжди розгортається до shard configs для кожного розширення замість одного величезного процесу root-project. -
Запуски test wrapper завершуються коротким підсумком
[test] passed|failed|skipped ... in .... Власний рядок тривалості Vitest залишається деталлю для кожного shard. -
Спільний тестовий стан OpenClaw: використовуйте
src/test-utils/openclaw-test-state.tsз Vitest, коли тесту потрібні ізольованіHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH, config fixture, workspace, agent dir або auth-profile store. -
pnpm test:env-mutations:report: неблокувальний звіт про тести й harnesses, які напряму змінюютьHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH,OPENCLAW_WORKSPACE_DIRабо пов’язані env keys OpenClaw. Використовуйте його, щоб знаходити кандидатів для міграції на спільний helper test-state. -
Мокований E2E Control UI: використовуйте
pnpm test:ui:e2eдля смуги Vitest + Playwright, яка запускає Vite Control UI і керує реальною сторінкою Chromium проти мокованого Gateway WebSocket. Тести розташовані вui/src/**/*.e2e.test.ts; спільні mocks і controls розташовані вui/src/test-helpers/control-ui-e2e.ts.pnpm test:e2eвключає цю смугу. У робочих деревах Codex віддавайте перевагуnode scripts/run-vitest.mjs run --config test/vitest/vitest.ui-e2e.config.ts --configLoader runner ui/src/ui/e2e/chat-flow.e2e.test.tsдля крихітного таргетованого доказу після встановлення залежностей або Testbox/Crabbox для ширшого GUI-доказу. -
Process E2E helpers: використовуйте
test/helpers/openclaw-test-instance.ts, коли process-level E2E тесту Vitest потрібні запущений Gateway, CLI env, захоплення логів і cleanup в одному місці. -
TUI PTY тести: використовуйте
node scripts/run-vitest.mjs run --config test/vitest/vitest.tui-pty.config.tsдля швидкої PTY-смуги з fake-backend. ВикористовуйтеOPENCLAW_TUI_PTY_INCLUDE_LOCAL=1абоpnpm tui:pty:test:watch --mode localдля повільнішого smoketui --local, який мокує лише зовнішній model endpoint. Перевіряйте стабільний видимий текст або виклики fixture, а не сирі ANSI snapshots. -
Docker/Bash E2E helpers: смуги, що source
scripts/lib/docker-e2e-image.sh, можуть передаватиdocker_e2e_test_state_shell_b64 <label> <scenario>у контейнер і декодувати це за допомогоюscripts/lib/openclaw-e2e-instance.sh; multi-home scripts можуть передаватиdocker_e2e_test_state_function_b64і викликатиopenclaw_test_state_create <label> <scenario>у кожному flow. Нижчорівневі callers можуть використовуватиscripts/lib/openclaw-test-state.mjs shell --label <name> --scenario <name>для shell snippet всередині контейнера абоnode scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --jsonдля sourceable host env file.--передcreateне дає новішим Node runtimes трактувати--env-fileяк Node flag. Docker/Bash lanes, які запускають Gateway, можуть sourcescripts/lib/openclaw-e2e-instance.shвсередині контейнера для entrypoint resolution, мокованого запуску OpenAI, foreground/background запуску Gateway, readiness probes, state env export, log dumps і process cleanup. -
Повні запуски, запуски розширень і include-pattern shard runs оновлюють локальні timing data в
.artifacts/vitest-shard-timings.json; подальші whole-config runs використовують ці timings для балансування повільних і швидких shards. Include-pattern CI shards додають shard name до timing key, що зберігає видимість filtered shard timings без заміни whole-config timing data. УстановітьOPENCLAW_TEST_PROJECTS_TIMINGS=0, щоб ігнорувати локальний timing artifact. -
Вибрані test files
plugin-sdkіcommandsтепер маршрутизуються через dedicated light lanes, які залишають лишеtest/setup.ts, залишаючи runtime-heavy cases на їхніх наявних смугах. -
Вихідні файли із сусідніми тестами зіставляються з цим сусіднім тестом перед fallback до ширших directory globs. Зміни helper під
src/channels/plugins/contracts/test-helpers,src/plugin-sdk/test-helpersіsrc/plugins/contractsвикористовують локальний граф імпортів для запуску importing tests замість broad-running кожного shard, коли dependency path точний. -
auto-replyтепер також розділяється на три dedicated configs (core,top-level,reply), щоб reply harness не домінував над легшими top-level status/token/helper tests. -
Базова конфігурація Vitest тепер типово використовує
pool: "threads"іisolate: false, зі спільним non-isolated runner, увімкненим у configs репозиторію. -
pnpm test:channelsзапускаєvitest.channels.config.ts. -
pnpm test:extensionsіpnpm test extensionsзапускають усі extension/plugin shards. Важкі channel plugins, browser plugin і OpenAI запускаються як dedicated shards; інші plugin groups залишаються batched. Використовуйтеpnpm test extensions/<id>для однієї смуги bundled plugin. -
pnpm test:perf:imports: вмикає звітність Vitest import-duration + import-breakdown, водночас продовжуючи використовувати scoped lane routing для явних file/directory targets. -
pnpm test:perf:imports:changed: те саме профілювання імпортів, але лише для файлів, змінених відносноorigin/main. -
pnpm test:perf:changed:bench -- --ref <git-ref>бенчмаркить routed changed-mode path проти native root-project run для того самого committed git diff. -
pnpm test:perf:changed:bench -- --worktreeбенчмаркить поточний набір змін робочого дерева без попереднього commit. -
pnpm test:perf:profile:main: записує CPU profile для головного потоку Vitest (.artifacts/vitest-main-profile). -
pnpm test:perf:profile:runner: записує CPU + heap profiles для unit runner (.artifacts/vitest-runner-profile). -
pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json: запускає кожен full-suite Vitest leaf config послідовно та записує grouped duration data плюс JSON/log artifacts для кожної config. Test Performance Agent використовує це як baseline перед спробами виправити повільні тести. -
pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json: порівнює grouped reports після зміни, сфокусованої на продуктивності. -
pnpm test:docker:timings <summary.json>перевіряє повільні Docker lanes після Docker all run; використовуйтеpnpm test:docker:rerun <run-id|summary.json|failures.json>, щоб надрукувати дешеві таргетовані rerun commands з тих самих artifacts. -
Інтеграція Gateway: opt-in через
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm testабоpnpm test:gateway. -
pnpm test:e2e: запускає репозиторний E2E aggregate: gateway end-to-end smoke tests плюс моковану browser E2E lane Control UI. -
pnpm test:e2e:gateway: запускає gateway end-to-end smoke tests (multi-instance WS/HTTP/node pairing). Типово використовуєthreads+isolate: falseз adaptive workers уvitest.e2e.config.ts; налаштовуйте черезOPENCLAW_E2E_WORKERS=<n>і встановітьOPENCLAW_E2E_VERBOSE=1для verbose logs. -
pnpm test:live: запускає provider live tests (minimax/zai). Потребує API keys іLIVE=1(або provider-specific*_LIVE_TEST=1), щоб прибрати skip. -
pnpm test:docker:all: Збирає спільний образ live-test, один раз пакує OpenClaw як npm-тарбол, збирає/повторно використовує мінімальний образ раннера Node/Git і функціональний образ, який встановлює цей тарбол у/app, а потім запускає Docker smoke-лінії зOPENCLAW_SKIP_DOCKER_BUILD=1через зважений планувальник. Мінімальний образ (OPENCLAW_DOCKER_E2E_BARE_IMAGE) використовується для ліній інсталятора/оновлення/залежностей Plugin; ці лінії монтують попередньо зібраний тарбол замість використання скопійованих вихідних файлів репозиторію. Функціональний образ (OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE) використовується для звичайних ліній функціональності зібраного застосунку.scripts/package-openclaw-for-docker.mjsє єдиним локальним/CI пакувальником пакета й перевіряє тарбол іdist/postinstall-inventory.jsonперед тим, як Docker їх використає. Визначення Docker-ліній містяться вscripts/lib/docker-e2e-scenarios.mjs; логіка планувальника міститься вscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsвиконує вибраний план.node scripts/test-docker-all.mjs --plan-jsonвиводить CI-план, яким володіє планувальник, для вибраних ліній, типів образів, потреб у пакеті/live-образі, сценаріїв стану та перевірок облікових даних без збирання або запуску Docker.OPENCLAW_DOCKER_ALL_PARALLELISM=<n>керує слотами процесів і за замовчуванням дорівнює 10;OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM=<n>керує чутливим до провайдера хвостовим пулом і за замовчуванням дорівнює 10. Обмеження важких ліній за замовчуванням:OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=5іOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; обмеження провайдерів за замовчуванням дають одну важку лінію на провайдера черезOPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT=4,OPENCLAW_DOCKER_ALL_LIVE_CODEX_LIMIT=4іOPENCLAW_DOCKER_ALL_LIVE_GEMINI_LIMIT=4. Для більших хостів використовуйтеOPENCLAW_DOCKER_ALL_WEIGHT_LIMITабоOPENCLAW_DOCKER_ALL_DOCKER_LIMIT. Якщо одна лінія перевищує ефективне обмеження ваги або ресурсів на хості з низьким паралелізмом, вона все одно може стартувати з порожнього пулу й виконуватиметься сама, доки не звільнить ємність. Запуски ліній за замовчуванням рознесені на 2 секунди, щоб уникнути локальних сплесків створення в демоні Docker; перевизначте це черезOPENCLAW_DOCKER_ALL_START_STAGGER_MS=<ms>. Раннер за замовчуванням виконує попередні перевірки Docker, очищає застарілі контейнери OpenClaw E2E, виводить стан активних ліній кожні 30 секунд, спільно використовує кеші CLI-інструментів провайдерів між сумісними лініями, за замовчуванням один раз повторює тимчасові збої live-провайдера (OPENCLAW_DOCKER_ALL_LIVE_RETRIES=<n>) і зберігає час виконання ліній у.artifacts/docker-tests/lane-timings.jsonдля впорядкування від найдовших до найкоротших у наступних запусках. ВикористовуйтеOPENCLAW_DOCKER_ALL_DRY_RUN=1, щоб надрукувати маніфест ліній без запуску Docker,OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS=<ms>, щоб налаштувати вивід стану, абоOPENCLAW_DOCKER_ALL_TIMINGS=0, щоб вимкнути повторне використання таймінгів. ВикористовуйтеOPENCLAW_DOCKER_ALL_LIVE_MODE=skipлише для детермінованих/локальних ліній абоOPENCLAW_DOCKER_ALL_LIVE_MODE=onlyлише для ліній live-провайдера; псевдоніми пакетів:pnpm test:docker:local:allіpnpm test:docker:live:all. Режим лише live об’єднує основні й хвостові live-лінії в один пул, упорядкований від найдовших до найкоротших, щоб кошики провайдерів могли разом пакувати роботу Claude, Codex і Gemini. Раннер припиняє планувати нові pooled-лінії після першого збою, якщо не встановленоOPENCLAW_DOCKER_ALL_FAIL_FAST=0, а кожна лінія має резервний таймаут 120 хвилин, який можна перевизначити черезOPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS; вибрані live/хвостові лінії використовують суворіші обмеження для окремих ліній. Команди налаштування Docker для бекенду CLI мають власний таймаут черезOPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS(за замовчуванням 180). Журнали окремих ліній,summary.json,failures.jsonі таймінги фаз записуються в.artifacts/docker-tests/<run-id>/; використовуйтеpnpm test:docker:timings <summary.json>, щоб переглянути повільні лінії, іpnpm test:docker:rerun <run-id|summary.json|failures.json>, щоб надрукувати дешеві цільові команди повторного запуску. -
pnpm test:docker:browser-cdp-snapshot: Збирає вихідний E2E-контейнер на базі Chromium, запускає сирий CDP разом з ізольованим Gateway, виконуєbrowser doctor --deepі перевіряє, що знімки ролей CDP містять URL-адреси посилань, клікабельні елементи, підвищені курсором, посилання на iframe і метадані фреймів. -
pnpm test:docker:skill-install: Встановлює запакований тарбол OpenClaw у мінімальний Docker-раннер, вимикаєskills.install.allowUploadedArchives, визначає поточний slug навички з live-пошуку ClawHub, встановлює її черезopenclaw skills installі перевіряєSKILL.md,.clawhub/origin.json,.clawhub/lock.jsonіskills info --json. -
Live-проби бекенду CLI в Docker можна запускати як сфокусовані лінії, наприклад
pnpm test:docker:live-cli-backend:claude,pnpm test:docker:live-cli-backend:claude:resumeабоpnpm test:docker:live-cli-backend:claude:mcp. Gemini має відповідні псевдоніми:resumeі:mcp. -
pnpm test:docker:openwebui: Запускає контейнеризовані OpenClaw + Open WebUI, виконує вхід через Open WebUI, перевіряє/api/models, а потім запускає справжній проксійований чат через/api/chat/completions. Потребує придатного ключа live-моделі, завантажує зовнішній образ Open WebUI і не очікується як CI-стабільний на рівні звичайних unit/e2e-наборів. -
pnpm test:docker:mcp-channels: Запускає попередньо заповнений контейнер Gateway і другий клієнтський контейнер, який породжуєopenclaw mcp serve, а потім перевіряє виявлення маршрутизованих розмов, читання стенограм, метадані вкладень, поведінку черги live-подій, маршрутизацію вихідного надсилання та сповіщення каналу й дозволів у стилі Claude через справжній stdio-міст. Перевірка сповіщення Claude читає сирі stdio MCP-фрейми напряму, щоб smoke відображав те, що міст фактично видає. -
pnpm test:docker:upgrade-survivor: Встановлює запакований тарбол OpenClaw поверх забрудненої фікстури старого користувача, запускає оновлення пакета й неінтерактивний doctor без ключів live-провайдера або каналу, потім запускає loopback Gateway і перевіряє, що агенти, конфігурація каналу, списки дозволів Plugin, файли workspace/session, застарілий стан залежностей legacy Plugin, запуск і статус RPC зберігаються. -
pnpm test:docker:published-upgrade-survivor: За замовчуванням встановлюєopenclaw@latest, засіває реалістичні файли наявного користувача без ключів live-провайдера або каналу, налаштовує цю базову версію вбудованим рецептом командиopenclaw config set, оновлює цю опубліковану інсталяцію до запакованого тарбола OpenClaw, запускає неінтерактивний doctor, записує.artifacts/upgrade-survivor/summary.json, потім запускає loopback Gateway і перевіряє, що налаштовані наміри, файли workspace/session, застаріла конфігурація Plugin і legacy-стан залежностей, запуск,/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; набір reported-issues міститьconfigured-plugin-installs, щоб перевірити, що налаштовані зовнішні OpenClaw plugins автоматично встановлюються під час оновлення, іstale-source-plugin-shadow, щоб тіні Plugin лише з вихідного коду не ламали запуск. Package Acceptance надає їх якpublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesіpublished_upgrade_survivor_scenarios, а також розв’язує мета-токени базових версій, як-отlast-stable-4абоall-since-2026.4.23, перед передаванням точних специфікацій пакетів Docker-лініям. -
pnpm test:docker:update-migration: Запускає harness published-upgrade survivor у сценаріїplugin-deps-cleanupз інтенсивним очищенням, за замовчуванням починаючи зopenclaw@2026.4.23. Окремий workflowUpdate Migrationрозширює цю лінію зbaselines=all-since-2026.4.23, щоб кожен стабільний опублікований пакет, починаючи з.23, оновлювався до кандидата й доводив очищення залежностей налаштованих Plugin поза Full Release CI. -
pnpm test:docker:plugins: Запускає install/update smoke для локального шляху,file:, пакетів npm registry з hoisted-залежностями, рухомих git-посилань, фікстур ClawHub, оновлень marketplace і ввімкнення/перегляду Claude-bundle.
Локальний гейт PR
Для локальних перевірок перед злиттям/гейтом PR виконайте:
pnpm check:changedpnpm checkpnpm check:test-typespnpm buildpnpm testpnpm check:docs
Якщо pnpm test дає нестабільний збій на навантаженому хості, перезапустіть один раз, перш ніж вважати це регресією, а потім ізолюйте за допомогою pnpm test <path/to/test>. Для хостів з обмеженою памʼяттю використовуйте:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed
Бенчмарк затримки моделей (локальні ключі)
Скрипт: scripts/bench-model.ts
Використання:
pnpm tsx scripts/bench-model.ts --runs 10- Необовʼязкові змінні середовища:
MINIMAX_API_KEY,MINIMAX_BASE_URL,MINIMAX_MODEL,ANTHROPIC_API_KEY - Типовий промпт: "Відповідай одним словом: ok. Без пунктуації або додаткового тексту."
Останній запуск (2025-12-31, 20 запусків):
- minimax медіана 1279 мс (мін. 1114, макс. 2431)
- opus медіана 2454 мс (мін. 1224, макс. 3170)
Бенчмарк запуску CLI
Скрипт: scripts/bench-cli-startup.ts
Використання:
pnpm test:startup:benchpnpm test:startup:bench:smokepnpm test:startup:bench:savepnpm test:startup:bench:updatepnpm test:startup:bench:checkpnpm tsx scripts/bench-cli-startup.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
Пресети:
startup:--version,--help,health,health --json,status --json,statusreal:health,status,status --json,sessions,sessions --json,tasks --json,tasks list --json,tasks audit --json,agents list --json,gateway status,gateway status --json,gateway health --json,config get gateway.portall: обидва пресети
Вивід містить sampleCount, середнє, p50, p95, мін./макс., розподіл кодів виходу/сигналів і підсумки максимального RSS для кожної команди. Необовʼязкові --cpu-prof-dir / --heap-prof-dir записують профілі V8 для кожного запуску, щоб вимірювання часу й захоплення профілю використовували той самий harness.
Угоди щодо збереженого виводу:
pnpm test:startup:bench:smokeзаписує цільовий smoke-артефакт у.artifacts/cli-startup-bench-smoke.jsonpnpm test:startup:bench:saveзаписує артефакт повного набору в.artifacts/cli-startup-bench-all.jsonзruns=5іwarmup=1pnpm test:startup:bench:updateоновлює зафіксовану в репозиторії базову fixture уtest/fixtures/cli-startup-bench.jsonзruns=5іwarmup=1
Зафіксована в репозиторії fixture:
test/fixtures/cli-startup-bench.json- Оновити за допомогою
pnpm test:startup:bench:update - Порівняти поточні результати з fixture за допомогою
pnpm test:startup:bench:check
Бенчмарк запуску Gateway
Скрипт: scripts/bench-gateway-startup.ts
Бенчмарк типово використовує зібрану точку входу CLI в dist/entry.js; виконайте
pnpm build перед використанням команд package-script. Щоб натомість виміряти source
runner, передайте --entry scripts/run-node.mjs і тримайте ці результати
окремо від базових показників зібраної точки входу.
Використання:
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
Ідентифікатори сценаріїв:
default: звичайний запуск Gateway.skipChannels: запуск Gateway із пропущеним запуском каналів.oneInternalHook: один налаштований внутрішній hook.allInternalHooks: усі внутрішні hooks.fiftyPlugins: 50 плагінів маніфестів.fiftyStartupLazyPlugins: 50 startup-lazy плагінів маніфестів.
Вивід містить перший вивід процесу, /healthz, /readyz, час журналу прослуховування HTTP,
час журналу готовності Gateway, час CPU, співвідношення ядра CPU, максимальний RSS, heap, метрики трасування запуску,
затримку event-loop і детальні метрики таблиці пошуку плагінів. Скрипт
увімкнює OPENCLAW_GATEWAY_STARTUP_TRACE=1 у середовищі дочірнього Gateway.
Читайте /healthz як ознаку життєздатності: HTTP-сервер може відповідати. Читайте /readyz як
придатну готовність: sidecar-процеси startup-плагінів, канали й ready-critical
робота після приєднання завершилися. Startup hooks Gateway диспетчеризуються
асинхронно й не є частиною гарантії готовності. Час журналу готовності — це
внутрішня позначка часу журналу готовності Gateway; вона корисна для атрибуції
з боку процесу, але не замінює зовнішній probe /readyz.
Використовуйте JSON-вивід або --output під час порівняння змін. Використовуйте --cpu-prof-dir лише
після того, як вивід трасування вказує на імпорт, компіляцію або CPU-bound роботу, яку неможливо
пояснити лише фазовими таймінгами. Не порівнюйте результати source-runner із
результатами зібраного dist/entry.js як одну й ту саму базову лінію.
Бенчмарк перезапуску Gateway
Скрипт: scripts/bench-gateway-restart.ts
Бенчмарк перезапуску підтримується лише на macOS і Linux. Він використовує SIGUSR1 для перезапусків усередині процесу й одразу завершується помилкою на Windows.
Бенчмарк типово використовує зібрану точку входу CLI в dist/entry.js; виконайте
pnpm build перед використанням команд package-script. Щоб натомість виміряти source
runner, передайте --entry scripts/run-node.mjs і тримайте ці результати
окремо від базових показників зібраної точки входу.
Використання:
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
Ідентифікатори сценаріїв:
skipChannels: перезапуск із пропущеними каналами.skipChannelsAcpxProbe: перезапуск із пропущеними каналами та ввімкненим startup probe ACPX.skipChannelsNoAcpxProbe: перезапуск із пропущеними каналами та вимкненим startup probe ACPX.default: звичайний перезапуск.fiftyPlugins: перезапуск із 50 плагінами маніфестів.
Вивід містить наступний /healthz, наступний /readyz, downtime, таймінг готовності після перезапуску,
CPU, RSS, метрики трасування запуску для процесу-заміни та метрики трасування перезапуску
для обробки сигналу, drain активної роботи, фаз закриття, наступного старту, таймінгу
готовності й знімків памʼяті. Скрипт увімкнює
OPENCLAW_GATEWAY_STARTUP_TRACE=1 і OPENCLAW_GATEWAY_RESTART_TRACE=1 у
середовищі дочірнього Gateway.
Використовуйте цей бенчмарк, коли зміна торкається сигналізації перезапуску, close handlers,
startup-after-restart, завершення sidecar-процесів, передавання сервісу або готовності після
перезапуску. Починайте зі skipChannels, коли ізолюєте механіку Gateway від запуску каналів.
Використовуйте default або сценарії з великою кількістю плагінів лише після того, як вузький сценарій пояснює
шлях перезапуску.
Метрики трасування — це підказки для атрибуції, а не вердикти. Зміну перезапуску слід
оцінювати за кількома зразками, відповідним owner span, поведінкою /healthz і /readyz
та користувацьким контрактом перезапуску.
Onboarding E2E (Docker)
Docker необовʼязковий; це потрібно лише для контейнеризованих smoke-тестів onboarding.
Повний cold-start flow у чистому Linux-контейнері:
scripts/e2e/onboard-docker.shЦей скрипт керує інтерактивним майстром через pseudo-tty, перевіряє файли config/workspace/session, потім запускає Gateway і виконує openclaw health.
Smoke-тест імпорту QR (Docker)
Перевіряє, що підтримуваний runtime helper QR завантажується в підтримуваних Docker runtime Node (Node 24 за замовчуванням, Node 22 сумісний):
pnpm test:docker:qr