Release and CI
Pruebas
-
Kit completo de pruebas (suites, en vivo, Docker): Pruebas
-
Validación de actualizaciones y paquetes de plugin: Pruebas de actualizaciones y plugins
-
Orden rutinario de pruebas locales:
pnpm test:changedpara prueba de Vitest con alcance de cambios.pnpm test <path-or-filter>para un archivo, directorio u objetivo explícito.pnpm testsolo cuando necesitas intencionalmente la suite local completa de Vitest.
-
pnpm test:force: Mata cualquier proceso de gateway persistente que retenga el puerto de control predeterminado y luego ejecuta la suite completa de Vitest con un puerto de Gateway aislado para que las pruebas de servidor no colisionen con una instancia en ejecución. Úsalo cuando una ejecución previa de Gateway haya dejado ocupado el puerto 18789. -
pnpm test:coverage: Ejecuta la suite unitaria con cobertura V8 (mediantevitest.unit.config.ts). Esta es una puerta de cobertura del carril unitario predeterminado, no cobertura de todos los archivos de todo el repositorio. Los umbrales son 70% para líneas/funciones/sentencias y 55% para ramas. Comocoverage.alles false y el carril predeterminado limita los includes de cobertura a pruebas unitarias no rápidas con archivos fuente hermanos, la puerta mide el código fuente propiedad de este carril en lugar de cada importación transitiva que llegue a cargar. -
pnpm test:coverage:changed: Ejecuta cobertura unitaria solo para archivos cambiados desdeorigin/main. -
pnpm test:changed: ejecución barata e inteligente de pruebas modificadas. Ejecuta objetivos precisos a partir de ediciones directas de pruebas, archivos hermanos*.test.ts, mapeos explícitos de código fuente y el grafo local de importaciones. Los cambios amplios/de configuración/de paquete se omiten salvo que se asignen a pruebas precisas. -
OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed: ejecución explícita amplia de pruebas modificadas. Úsala cuando una edición de arnés/configuración/paquete de pruebas deba recurrir al comportamiento más amplio de pruebas modificadas de Vitest. -
pnpm changed:lanes: muestra los carriles arquitectónicos activados por el diff contraorigin/main. -
pnpm check:changed: delega en Crabbox/Testbox de forma predeterminada fuera de CI y luego ejecuta la puerta inteligente de comprobación de cambios para el diff contraorigin/maindentro del hijo remoto. Ejecuta typecheck, lint y comandos de guardia para los carriles arquitectónicos afectados, pero no ejecuta pruebas de Vitest. Usapnpm test:changedopnpm test <target>explícito para prueba de tests. -
Worktrees de Codex y checkouts enlazados/dispersos: evita
pnpm test*,pnpm check*ypnpm crabbox:runlocales directos salvo que hayas verificado que pnpm no conciliará dependencias. Para prueba diminuta de archivo explícito usanode scripts/run-vitest.mjs <path-or-filter>; para puertas de cambios o prueba amplia usanode scripts/crabbox-wrapper.mjs run --provider blacksmith-testbox ... -- env OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 corepack pnpm check:changedpara que pnpm se ejecute dentro de Testbox. -
Prueba de Testbox mediante Crabbox: usa el
exitCodefinal del wrapper y el JSON de tiempos como resultado del comando. La ejecución delegada de Blacksmith GitHub Actions puede mostrarcancelleddespués de un comando SSH exitoso porque el Testbox se detiene desde fuera de la acción de keepalive; verifica el resumen del wrapper y la salida del comando antes de tratarlo como un fallo de prueba. -
OPENCLAW_HEAVY_CHECK_LOCK_SCOPE=worktree <local-heavy-check command>: mantiene la serialización de comprobaciones pesadas dentro del worktree actual en lugar del directorio común de Git para comandos comopnpm check:changedypnpm test ...dirigidos. Úsalo solo en hosts locales de alta capacidad cuando ejecutes intencionalmente comprobaciones independientes entre worktrees enlazados. -
pnpm test: enruta objetivos explícitos de archivo/directorio a través de carriles de Vitest con alcance. Las ejecuciones sin objetivo son prueba de suite completa: usan grupos de shards fijos, se expanden a configuraciones hoja para ejecución paralela local e imprimen la dispersión de shards local esperada antes de comenzar. El grupo de extensiones siempre se expande a las configuraciones de shard por extensión en lugar de a un proceso gigante de proyecto raíz. -
Las ejecuciones del wrapper de pruebas terminan con un resumen breve
[test] passed|failed|skipped ... in .... La línea de duración propia de Vitest permanece como detalle por shard. -
Estado de pruebas compartido de OpenClaw: usa
src/test-utils/openclaw-test-state.tsdesde Vitest cuando una prueba necesite unHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH, fixture de configuración, workspace, directorio de agente o almacén de perfiles de autenticación aislados. -
pnpm test:env-mutations:report: informe no bloqueante de pruebas y arneses que mutan directamenteHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH,OPENCLAW_WORKSPACE_DIRo claves de entorno relacionadas de OpenClaw. Úsalo para encontrar candidatos para migración al helper compartido de estado de pruebas. -
E2E simulado de Control UI: usa
pnpm test:ui:e2epara el carril Vitest + Playwright que inicia la Control UI de Vite y maneja una página real de Chromium contra un WebSocket de Gateway simulado. Las pruebas viven enui/src/**/*.e2e.test.ts; los mocks y controles compartidos viven enui/src/test-helpers/control-ui-e2e.ts.pnpm test:e2eincluye este carril. En worktrees de Codex, prefierenode scripts/run-vitest.mjs run --config test/vitest/vitest.ui-e2e.config.ts --configLoader runner ui/src/ui/e2e/chat-flow.e2e.test.tspara prueba diminuta dirigida después de instalar dependencias, o Testbox/Crabbox para prueba GUI más amplia. -
Helpers de E2E de proceso: usa
test/helpers/openclaw-test-instance.tscuando una prueba E2E de nivel de proceso de Vitest necesita un Gateway en ejecución, entorno CLI, captura de logs y limpieza en un solo lugar. -
Pruebas TUI PTY: usa
node scripts/run-vitest.mjs run --config test/vitest/vitest.tui-pty.config.tspara el carril PTY rápido de backend falso. UsaOPENCLAW_TUI_PTY_INCLUDE_LOCAL=1opnpm tui:pty:test:watch --mode localpara el smoke más lento detui --local, que simula solo el endpoint externo del modelo. Afirma texto visible estable o llamadas a fixtures, no snapshots ANSI sin procesar. -
Helpers de E2E Docker/Bash: los carriles que hacen source de
scripts/lib/docker-e2e-image.shpueden pasardocker_e2e_test_state_shell_b64 <label> <scenario>al contenedor y decodificarlo conscripts/lib/openclaw-e2e-instance.sh; los scripts multi-home pueden pasardocker_e2e_test_state_function_b64y llamar aopenclaw_test_state_create <label> <scenario>en cada flujo. Los llamadores de menor nivel pueden usarscripts/lib/openclaw-test-state.mjs shell --label <name> --scenario <name>para un snippet de shell dentro del contenedor, onode scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --jsonpara un archivo de entorno de host al que se pueda hacer source. El--antes decreateevita que runtimes más nuevos de Node traten--env-filecomo una bandera de Node. Los carriles Docker/Bash que lanzan un Gateway pueden hacer source descripts/lib/openclaw-e2e-instance.shdentro del contenedor para resolución de entrypoint, arranque simulado de OpenAI, lanzamiento de Gateway en primer plano/segundo plano, sondas de readiness, exportación de entorno de estado, volcados de logs y limpieza de procesos. -
Las ejecuciones de shards completas, de extensiones y con patrón de inclusión actualizan datos de tiempos locales en
.artifacts/vitest-shard-timings.json; las ejecuciones posteriores de configuración completa usan esos tiempos para equilibrar shards lentos y rápidos. Los shards de CI con patrón de inclusión agregan el nombre del shard a la clave de tiempos, lo que mantiene visibles los tiempos de shards filtrados sin reemplazar los datos de tiempos de configuración completa. DefineOPENCLAW_TEST_PROJECTS_TIMINGS=0para ignorar el artefacto local de tiempos. -
Archivos de prueba seleccionados de
plugin-sdkycommandsahora se enrutan por carriles ligeros dedicados que mantienen solotest/setup.ts, dejando los casos pesados de runtime en sus carriles existentes. -
Los archivos fuente con pruebas hermanas se asignan a ese hermano antes de recurrir a globs de directorio más amplios. Las ediciones de helpers bajo
src/channels/plugins/contracts/test-helpers,src/plugin-sdk/test-helpersysrc/plugins/contractsusan un grafo local de importaciones para ejecutar las pruebas que importan, en lugar de ejecutar ampliamente cada shard cuando la ruta de dependencia es precisa. -
auto-replyahora también se divide en tres configuraciones dedicadas (core,top-level,reply) para que el arnés de respuestas no domine las pruebas más ligeras de estado/token/helpers de nivel superior. -
La configuración base de Vitest ahora usa de forma predeterminada
pool: "threads"eisolate: false, con el runner compartido no aislado habilitado en todas las configuraciones del repositorio. -
pnpm test:channelsejecutavitest.channels.config.ts. -
pnpm test:extensionsypnpm test extensionsejecutan todos los shards de extensiones/plugins. Los plugins pesados de canal, el plugin de navegador y OpenAI se ejecutan como shards dedicados; otros grupos de plugins permanecen agrupados. Usapnpm test extensions/<id>para un carril de un solo plugin incluido. -
pnpm test:perf:imports: habilita informes de duración de importaciones + desglose de importaciones de Vitest, sin dejar de usar enrutamiento por carriles con alcance para objetivos explícitos de archivo/directorio. -
pnpm test:perf:imports:changed: el mismo perfilado de importaciones, pero solo para archivos cambiados desdeorigin/main. -
pnpm test:perf:changed:bench -- --ref <git-ref>mide el rendimiento de la ruta en modo de cambios enrutada frente a la ejecución nativa del proyecto raíz para el mismo diff de git confirmado. -
pnpm test:perf:changed:bench -- --worktreemide el rendimiento del conjunto de cambios del worktree actual sin confirmar primero. -
pnpm test:perf:profile:main: escribe un perfil de CPU para el hilo principal de Vitest (.artifacts/vitest-main-profile). -
pnpm test:perf:profile:runner: escribe perfiles de CPU + heap para el runner unitario (.artifacts/vitest-runner-profile). -
pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json: ejecuta en serie cada configuración hoja de Vitest de la suite completa y escribe datos de duración agrupados más artefactos JSON/log por configuración. El Test Performance Agent usa esto como línea base antes de intentar correcciones de pruebas lentas. -
pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json: compara informes agrupados después de un cambio centrado en rendimiento. -
pnpm test:docker:timings <summary.json>inspecciona carriles Docker lentos después de una ejecución Docker completa; usapnpm test:docker:rerun <run-id|summary.json|failures.json>para imprimir comandos baratos de repetición dirigidos desde los mismos artefactos. -
Integración de Gateway: participación opcional mediante
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm testopnpm test:gateway. -
pnpm test:e2e: Ejecuta el agregado E2E del repositorio: pruebas smoke end-to-end de Gateway más el carril E2E de navegador simulado de Control UI. -
pnpm test:e2e:gateway: Ejecuta pruebas smoke end-to-end de Gateway (emparejamiento multiinstancia WS/HTTP/node). Usa de forma predeterminadathreads+isolate: falsecon workers adaptativos envitest.e2e.config.ts; ajusta conOPENCLAW_E2E_WORKERS=<n>y defineOPENCLAW_E2E_VERBOSE=1para logs detallados. -
pnpm test:live: Ejecuta pruebas live de proveedores (minimax/zai). Requiere claves de API yLIVE=1(o*_LIVE_TEST=1específico del proveedor) para dejar de omitirlas. -
pnpm test:docker:all: Compila la imagen compartida de pruebas live, empaqueta OpenClaw una vez como un tarball de npm, compila/reutiliza una imagen básica de ejecución con Node/Git más una imagen funcional que instala ese tarball en/app, y luego ejecuta carriles de smoke de Docker conOPENCLAW_SKIP_DOCKER_BUILD=1mediante un planificador ponderado. La imagen básica (OPENCLAW_DOCKER_E2E_BARE_IMAGE) se usa para carriles de instalador/actualización/dependencias de Plugin; esos carriles montan el tarball precompilado en lugar de usar fuentes copiadas del repositorio. La imagen funcional (OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE) se usa para carriles normales de funcionalidad de la aplicación compilada.scripts/package-openclaw-for-docker.mjses el único empaquetador local/CI y valida el tarball másdist/postinstall-inventory.jsonantes de que Docker lo consuma. Las definiciones de carriles de Docker viven enscripts/lib/docker-e2e-scenarios.mjs; la lógica del planificador vive enscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsejecuta el plan seleccionado.node scripts/test-docker-all.mjs --plan-jsonemite el plan de CI propiedad del planificador para carriles seleccionados, tipos de imagen, necesidades de paquete/imagen live, escenarios de estado y comprobaciones de credenciales sin compilar ni ejecutar Docker.OPENCLAW_DOCKER_ALL_PARALLELISM=<n>controla los espacios de proceso y tiene un valor predeterminado de 10;OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM=<n>controla el grupo de cola sensible al proveedor y tiene un valor predeterminado de 10. Los límites de carriles pesados tienen valores predeterminados deOPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=5yOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; los límites de proveedor tienen como valor predeterminado un carril pesado por proveedor medianteOPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT=4,OPENCLAW_DOCKER_ALL_LIVE_CODEX_LIMIT=4yOPENCLAW_DOCKER_ALL_LIVE_GEMINI_LIMIT=4. UsaOPENCLAW_DOCKER_ALL_WEIGHT_LIMITuOPENCLAW_DOCKER_ALL_DOCKER_LIMITpara hosts más grandes. Si un carril supera el peso efectivo o el límite de recursos en un host de bajo paralelismo, aún puede iniciarse desde un grupo vacío y se ejecutará solo hasta que libere capacidad. Los inicios de carril se escalonan 2 segundos de forma predeterminada para evitar tormentas de creación del daemon local de Docker; sobrescríbelo conOPENCLAW_DOCKER_ALL_START_STAGGER_MS=<ms>. El ejecutor realiza preflight de Docker de forma predeterminada, limpia contenedores E2E obsoletos de OpenClaw, emite estado de carriles activos cada 30 segundos, comparte cachés de herramientas CLI de proveedores entre carriles compatibles, reintenta una vez de forma predeterminada los fallos transitorios de proveedores live (OPENCLAW_DOCKER_ALL_LIVE_RETRIES=<n>) y almacena tiempos de carriles en.artifacts/docker-tests/lane-timings.jsonpara ordenar primero los más largos en ejecuciones posteriores. UsaOPENCLAW_DOCKER_ALL_DRY_RUN=1para imprimir el manifiesto de carriles sin ejecutar Docker,OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS=<ms>para ajustar la salida de estado, oOPENCLAW_DOCKER_ALL_TIMINGS=0para deshabilitar la reutilización de tiempos. UsaOPENCLAW_DOCKER_ALL_LIVE_MODE=skipsolo para carriles deterministas/locales oOPENCLAW_DOCKER_ALL_LIVE_MODE=onlysolo para carriles de proveedores live; los alias de paquete sonpnpm test:docker:local:allypnpm test:docker:live:all. El modo solo live fusiona los carriles live principales y de cola en un único grupo ordenado primero por los más largos para que los buckets de proveedor puedan empaquetar juntos trabajo de Claude, Codex y Gemini. El ejecutor deja de planificar nuevos carriles agrupados después del primer fallo a menos que se establezcaOPENCLAW_DOCKER_ALL_FAIL_FAST=0, y cada carril tiene un tiempo de espera de respaldo de 120 minutos sobrescribible conOPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS; los carriles live/de cola seleccionados usan límites por carril más estrictos. Los comandos de configuración de Docker del backend de CLI tienen su propio tiempo de espera medianteOPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS(predeterminado 180). Los registros por carril,summary.json,failures.jsony tiempos de fase se escriben bajo.artifacts/docker-tests/<run-id>/; usapnpm test:docker:timings <summary.json>para inspeccionar carriles lentos ypnpm test:docker:rerun <run-id|summary.json|failures.json>para imprimir comandos de reejecución específicos y baratos. -
pnpm test:docker:browser-cdp-snapshot: Compila un contenedor E2E de fuentes respaldado por Chromium, inicia CDP sin procesar más un Gateway aislado, ejecutabrowser doctor --deepy verifica que las instantáneas de roles de CDP incluyan URL de enlaces, elementos clicables promovidos por cursor, referencias de iframe y metadatos de frame. -
pnpm test:docker:skill-install: Instala el tarball empaquetado de OpenClaw en un ejecutor básico de Docker, deshabilitaskills.install.allowUploadedArchives, resuelve un slug de skill actual desde la búsqueda live de ClawHub, lo instala medianteopenclaw skills instally verificaSKILL.md,.clawhub/origin.json,.clawhub/lock.jsonyskills info --json. -
Las sondas live de Docker del backend de CLI se pueden ejecutar como carriles enfocados, por ejemplo
pnpm test:docker:live-cli-backend:claude,pnpm test:docker:live-cli-backend:claude:resumeopnpm test:docker:live-cli-backend:claude:mcp. Gemini tiene alias equivalentes:resumey:mcp. -
pnpm test:docker:openwebui: Inicia OpenClaw + Open WebUI dockerizados, inicia sesión mediante Open WebUI, comprueba/api/modelsy luego ejecuta un chat real con proxy mediante/api/chat/completions. Requiere una clave de modelo live utilizable, extrae una imagen externa de Open WebUI y no se espera que sea estable en CI como las suites normales unitarias/e2e. -
pnpm test:docker:mcp-channels: Inicia un contenedor de Gateway con datos iniciales y un segundo contenedor cliente que generaopenclaw mcp serve, luego verifica el descubrimiento de conversaciones enrutadas, lecturas de transcripciones, metadatos de adjuntos, comportamiento de cola de eventos live, enrutamiento de envíos salientes y notificaciones de canal + permisos al estilo Claude sobre el puente stdio real. La aserción de notificación de Claude lee directamente los frames MCP stdio sin procesar para que el smoke refleje lo que el puente realmente emite. -
pnpm test:docker:upgrade-survivor: Instala el tarball empaquetado de OpenClaw sobre un fixture sucio de usuario antiguo, ejecuta actualización de paquete más doctor no interactivo sin claves de proveedor live ni de canal, luego inicia un Gateway de local loopback y comprueba que agentes, configuración de canal, listas de permitidos de Plugin, archivos de espacio de trabajo/sesión, estado obsoleto de dependencias de Plugin heredado, inicio y estado RPC sobrevivan. -
pnpm test:docker:published-upgrade-survivor: Instalaopenclaw@latestde forma predeterminada, siembra archivos realistas de usuario existente sin claves de proveedor live ni de canal, configura esa base con una receta incorporada de comandoopenclaw config set, actualiza esa instalación publicada al tarball empaquetado de OpenClaw, ejecuta doctor no interactivo, escribe.artifacts/upgrade-survivor/summary.json, luego inicia un Gateway de local loopback y comprueba que intenciones configuradas, archivos de espacio de trabajo/sesión, configuración obsoleta de Plugin y estado de dependencias heredado, inicio,/healthz,/readyzy estado RPC sobrevivan o se reparen limpiamente. Sobrescribe una base conOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, expande una matriz local exacta conOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECScomoopenclaw@2026.5.2 openclaw@2026.4.23 openclaw@2026.4.15, o agrega fixtures de escenario conOPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues; el conjunto reported-issues incluyeconfigured-plugin-installspara verificar que los Plugins externos de OpenClaw configurados se instalen automáticamente durante la actualización ystale-source-plugin-shadowpara evitar que sombras de Plugin solo de fuente rompan el inicio. Package Acceptance expone esos valores comopublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesypublished_upgrade_survivor_scenarios, y resuelve tokens de base meta comolast-stable-4oall-since-2026.4.23antes de entregar especificaciones exactas de paquete a los carriles de Docker. -
pnpm test:docker:update-migration: Ejecuta el arnés de supervivencia de actualización publicada en el escenario con mucha limpiezaplugin-deps-cleanup, comenzando enopenclaw@2026.4.23de forma predeterminada. El flujo de trabajo separadoUpdate Migrationexpande este carril conbaselines=all-since-2026.4.23para que cada paquete estable publicado desde.23en adelante se actualice al candidato y demuestre la limpieza de dependencias de Plugin configuradas fuera de Full Release CI. -
pnpm test:docker:plugins: Ejecuta smoke de instalación/actualización para ruta local,file:, paquetes del registro npm con dependencias elevadas, refs móviles de git, fixtures de ClawHub, actualizaciones de marketplace e habilitar/inspeccionar paquete de Claude.
Puerta local de PR
Para comprobaciones locales de aterrizaje/puerta de PR, ejecuta:
pnpm check:changedpnpm checkpnpm check:test-typespnpm buildpnpm testpnpm check:docs
Si pnpm test falla de forma intermitente en un host cargado, vuelve a ejecutarlo una vez antes de tratarlo como una regresión y luego aísla con pnpm test <path/to/test>. Para hosts con memoria limitada, usa:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed
Banco de latencia de modelos (claves locales)
Script: scripts/bench-model.ts
Uso:
pnpm tsx scripts/bench-model.ts --runs 10- Entorno opcional:
MINIMAX_API_KEY,MINIMAX_BASE_URL,MINIMAX_MODEL,ANTHROPIC_API_KEY - Prompt predeterminado: "Responde con una sola palabra: ok. Sin puntuación ni texto adicional."
Última ejecución (2025-12-31, 20 ejecuciones):
- mediana de minimax 1279ms (mín. 1114, máx. 2431)
- mediana de opus 2454ms (mín. 1224, máx. 3170)
Banco de arranque de CLI
Script: scripts/bench-cli-startup.ts
Uso:
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
Preajustes:
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: ambos preajustes
La salida incluye sampleCount, promedio, p50, p95, mín./máx., distribución de códigos de salida/señales y resúmenes de RSS máximo para cada comando. Opcionalmente, --cpu-prof-dir / --heap-prof-dir escribe perfiles V8 por ejecución para que la temporización y la captura de perfiles usen el mismo arnés.
Convenciones de salida guardada:
pnpm test:startup:bench:smokeescribe el artefacto de smoke dirigido en.artifacts/cli-startup-bench-smoke.jsonpnpm test:startup:bench:saveescribe el artefacto de la suite completa en.artifacts/cli-startup-bench-all.jsonusandoruns=5ywarmup=1pnpm test:startup:bench:updateactualiza el fixture base versionado entest/fixtures/cli-startup-bench.jsonusandoruns=5ywarmup=1
Fixture versionado:
test/fixtures/cli-startup-bench.json- Actualiza con
pnpm test:startup:bench:update - Compara los resultados actuales con el fixture usando
pnpm test:startup:bench:check
Banco de arranque de Gateway
Script: scripts/bench-gateway-startup.ts
El benchmark usa de forma predeterminada la entrada de CLI compilada en dist/entry.js; ejecuta
pnpm build antes de usar los comandos de script del paquete. Para medir el ejecutor de código fuente
en su lugar, pasa --entry scripts/run-node.mjs y mantén esos resultados
separados de las líneas base de la entrada compilada.
Uso:
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
IDs de casos:
default: arranque normal de Gateway.skipChannels: arranque de Gateway con el arranque de canales omitido.oneInternalHook: un hook interno configurado.allInternalHooks: todos los hooks internos.fiftyPlugins: 50 plugins de manifiesto.fiftyStartupLazyPlugins: 50 plugins de manifiesto con arranque diferido.
La salida incluye la primera salida del proceso, /healthz, /readyz, tiempo del log de escucha HTTP,
tiempo del log de Gateway listo, tiempo de CPU, proporción de núcleos de CPU, RSS máximo, heap, métricas
de traza de arranque, retraso del bucle de eventos y métricas detalladas de la tabla de búsqueda de plugins. El script
habilita OPENCLAW_GATEWAY_STARTUP_TRACE=1 en el entorno del Gateway hijo.
Lee /healthz como vivacidad: el servidor HTTP puede responder. Lee /readyz como
preparación utilizable: los sidecars de plugins de arranque, los canales y el trabajo
posterior al adjunto crítico para estar listo se han estabilizado. Los hooks de arranque de Gateway se despachan
de forma asíncrona y no forman parte de la garantía de preparación. El tiempo del log de listo es la
marca de tiempo interna del log de listo de Gateway; es útil para atribución del lado del proceso,
pero no sustituye la sonda externa /readyz.
Usa salida JSON o --output al comparar cambios. Usa --cpu-prof-dir solo
después de que la salida de traza apunte a importación, compilación o trabajo ligado a CPU que no pueda
explicarse solo con las temporizaciones de fase. No compares resultados del ejecutor de código fuente con
resultados compilados de dist/entry.js como si fueran la misma línea base.
Banco de reinicio de Gateway
Script: scripts/bench-gateway-restart.ts
El benchmark de reinicio solo es compatible con macOS y Linux. Usa SIGUSR1 para reinicios dentro del proceso y falla inmediatamente en Windows.
El benchmark usa de forma predeterminada la entrada de CLI compilada en dist/entry.js; ejecuta
pnpm build antes de usar los comandos de script del paquete. Para medir el ejecutor de código fuente
en su lugar, pasa --entry scripts/run-node.mjs y mantén esos resultados
separados de las líneas base de la entrada compilada.
Uso:
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
IDs de casos:
skipChannels: reinicio con canales omitidos.skipChannelsAcpxProbe: reinicio con canales omitidos y sonda de arranque ACPX activada.skipChannelsNoAcpxProbe: reinicio con canales omitidos y sonda de arranque ACPX desactivada.default: reinicio normal.fiftyPlugins: reinicio con 50 plugins de manifiesto.
La salida incluye el siguiente /healthz, el siguiente /readyz, tiempo de inactividad, temporización
de listo tras reinicio, CPU, RSS, métricas de traza de arranque para el proceso de reemplazo y métricas
de traza de reinicio para manejo de señales, drenaje de trabajo activo, fases de cierre, siguiente arranque,
temporización de listo e instantáneas de memoria. El script habilita
OPENCLAW_GATEWAY_STARTUP_TRACE=1 y OPENCLAW_GATEWAY_RESTART_TRACE=1 en el
entorno del Gateway hijo.
Usa este benchmark cuando un cambio toca señalización de reinicio, manejadores de cierre,
arranque tras reinicio, apagado de sidecars, traspaso de servicio o preparación después del
reinicio. Empieza con skipChannels al aislar la mecánica de Gateway del arranque de canales.
Usa default o casos con muchos plugins solo después de que el caso estrecho explique
la ruta de reinicio.
Las métricas de traza son pistas de atribución, no veredictos. Un cambio de reinicio debe
juzgarse a partir de varias muestras, el tramo de propietario correspondiente, el comportamiento de /healthz y /readyz,
y el contrato de reinicio visible para el usuario.
E2E de incorporación (Docker)
Docker es opcional; esto solo se necesita para pruebas smoke de incorporación en contenedores.
Flujo completo de arranque en frío en un contenedor Linux limpio:
scripts/e2e/onboard-docker.shEste script controla el asistente interactivo mediante una pseudo-tty, verifica archivos de configuración/espacio de trabajo/sesión, luego inicia el gateway y ejecuta openclaw health.
Smoke de importación QR (Docker)
Garantiza que el helper de runtime QR mantenido se cargue bajo los runtimes Docker Node compatibles (Node 24 predeterminado, Node 22 compatible):
pnpm test:docker:qr