智能体默认设置
智能体会话通过 Crabbox 远程运行测试和计算密集型验证。受信任的维护者代码默认使用 Blacksmith Testbox。配置的 Testbox 工作流会注入凭据,因此不受信任的贡献者或 fork 代码必须改用无密钥的 fork CI 或经过清理的直连 AWS Crabbox。 当受信任的代码任务很可能需要测试或重量级证明时,立即在后台命令会话中预热,在注入期间继续工作,复用返回的tbx_... id,每次运行都同步当前 checkout,并在交接前停止它:
--provider aws 预热。每次运行都必须设置 CRABBOX_ENV_ALLOW=CI,传入 --provider aws --no-hydrate,并在安装依赖或运行测试前使用全新的临时远程 HOME。使用专门为该不受信任来源新预热的租约;绝不要复用受信任或之前已注入凭据的租约。从干净受信任的 main checkout 启动已安装的受信任 Crabbox 二进制文件,并只用 --fresh-pr 获取远程 PR;绝不要在本地执行不受信任 checkout 的包装器或配置。取消设置 CRABBOX_AWS_INSTANCE_PROFILE,并在解析出的 aws.instanceProfile 非空时失败关闭。在任何安装/测试之前,使用受信任的绝对路径工具要求 IMDSv2 令牌,证明 IAM 凭据端点返回 404,并验证远程 git rev-parse HEAD 等于已审查 PR head 的完整 SHA。将租约绑定到该 SHA,并在 head 变化时停止/重新预热。从干净的 main 随 --fresh-pr 上传受信任的 scripts/crabbox-untrusted-bootstrap.sh;它会安装固定版本的 Node/pnpm,验证 SHA 和包管理器固定版本,隔离 HOME,安装依赖,然后执行请求的测试。如果 broker 无法证明没有角色或没有远程 PR,请使用无密钥的 fork CI。不要使用 hydrate-github、--no-sync 或注入了凭据的 Testbox 工作流。
取消设置所有 CRABBOX_TAILSCALE* 覆盖,强制 --network public --tailscale=false,清除 exit-node/LAN 标志,并要求 crabbox inspect 在上传任何脚本之前报告公共网络且没有 Tailscale 状态。
常规本地顺序
pnpm test:changed用于变更范围的 Vitest 证明。pnpm test <path-or-filter>用于单个文件、目录或明确目标。- 仅当你有意需要完整本地 Vitest 套件时,才运行
pnpm test。
pnpm test* / pnpm check* / pnpm crabbox:run:
- 用户明确请求的极小文件本地回退:
node scripts/run-vitest.mjs <path-or-filter>。 - 变更门禁或宽泛证明:
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 内运行。 - 包装器最终的
exitCode和 timing JSON 是命令结果。委托的 Blacksmith GitHub Actions 运行可能在成功的 SSH 命令后显示cancelled,因为 Testbox 是从 keepalive action 外部停止的;在将其视为失败前,检查包装器摘要和命令输出。 OPENCLAW_HEAVY_CHECK_LOCK_SCOPE=worktree <local-heavy-check command>:对于pnpm check:changed和定向pnpm test ...等命令,将 heavy-check 串行化限制在当前 worktree 内,而不是 Git common dir。仅当你有意在高容量本地主机上跨链接 worktree 运行独立检查时使用它。
核心命令
测试包装器运行结束时会带有简短的[test] passed|failed|skipped ... in ... 摘要;Vitest 自己的耗时行仍作为每个分片的细节。
| 命令 | 作用 |
|---|---|
pnpm test | 明确的文件/目录目标会通过作用域 Vitest lane 路由。无目标运行是全套件证明:固定分片组会展开为叶级配置以进行本地并行执行,并在开始前打印预期分片 fanout。extension 组始终展开为每个 extension 的分片配置,而不是一个巨大的根项目进程。 |
pnpm test:changed | 低成本的智能变更测试运行:从直接测试编辑、同级 *.test.ts 文件、明确源映射和本地导入图得到精确目标。宽泛/config/package 变更会被跳过,除非它们映射到精确测试。 |
OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed | 明确的宽泛变更测试运行;当测试 harness/config/package 编辑应回退到 Vitest 更宽泛的变更测试行为时使用。 |
pnpm test:force | 释放配置的 OpenClaw Gateway 网关端口(默认 18789),然后使用隔离的 Gateway 网关端口运行完整套件,这样服务器测试不会与正在运行的实例冲突。 |
pnpm test:coverage | 带 V8 覆盖率的单元套件(vitest.unit.config.ts)。这是默认单元 lane 门禁,不是整个仓库覆盖率:coverage.all 为 false,阈值为行/函数/语句 70%、分支 55%,范围限定为带同级源文件的非 fast 单元测试。 |
pnpm test:coverage:changed | 仅对自 origin/main 以来变更的文件运行单元覆盖率。 |
pnpm changed:lanes | 显示相对 origin/main 的 diff 触发的架构 lane。 |
pnpm check:changed | 在 CI 外默认委托给 Crabbox/Testbox,然后在远程子进程内运行智能变更检查门禁:受影响 lane 的 typecheck、lint 和 guard 命令。不运行 Vitest;如需测试证明,请使用 pnpm test:changed 或 pnpm test <target>。 |
共享测试状态和进程辅助工具
src/test-utils/openclaw-test-state.ts:当测试需要隔离的HOME、OPENCLAW_STATE_DIR、OPENCLAW_CONFIG_PATH、配置 fixture、工作区、智能体目录或 auth-profile 存储时,在 Vitest 中使用。pnpm test:env-mutations:report:非阻塞报告,列出直接修改HOME、OPENCLAW_STATE_DIR、OPENCLAW_CONFIG_PATH、OPENCLAW_WORKSPACE_DIR或相关环境键的测试/harness。用它查找可迁移到共享测试状态辅助工具的候选项。test/helpers/openclaw-test-instance.ts:供需要运行中 Gateway 网关、CLI 环境、日志捕获和集中清理的进程级 E2E 测试使用。- source
scripts/lib/docker-e2e-image.sh的 Docker/Bash E2E lane 可以将docker_e2e_test_state_shell_b64 <label> <scenario>传入容器,并用scripts/lib/openclaw-e2e-instance.sh解码;多 home 脚本可以传入docker_e2e_test_state_function_b64,并在每个流程中调用openclaw_test_state_create <label> <scenario>。node scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --json会写入可 source 的主机环境文件(create前的--会阻止较新的 Node 运行时将--env-file视为 Node 标志)。启动 Gateway 网关的 lane 可以 sourcescripts/lib/openclaw-e2e-instance.sh,用于入口点解析、模拟 OpenAI 启动、前台/后台启动、就绪探针、状态环境导出、日志转储和进程清理。
Control UI、TUI 和 extension lane
- Control UI 模拟 E2E:
pnpm test:ui:e2e运行 Vitest + Playwright lane,该 lane 启动 Vite Control UI,并驱动真实 Chromium 页面连接到模拟的 Gateway 网关 WebSocket。测试位于ui/src/**/*.e2e.test.ts;共享 mock/控件位于ui/src/test-helpers/control-ui-e2e.ts。pnpm test:e2e包含此 lane。智能体运行默认使用 Testbox/Crabbox,包括定向证明;仅在明确本地回退时使用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。 - TUI PTY 测试:
node scripts/run-vitest.mjs run --config test/vitest/vitest.tui-pty.config.ts运行快速的 fake-backend PTY lane。OPENCLAW_TUI_PTY_INCLUDE_LOCAL=1或pnpm tui:pty:test:watch --mode local运行较慢的tui --localsmoke,它只模拟外部模型端点。断言稳定的可见文本或 fixture 调用,而不是原始 ANSI 快照。 pnpm test:extensions和pnpm test extensions运行所有 extension/plugin 分片。重量级渠道插件、浏览器插件和 OpenAI 作为专用分片运行;其他插件组保持批处理。pnpm test extensions/<id>运行一个内置插件 lane。- 带有同级测试的源文件会先映射到该同级测试,然后再回退到更宽的目录 glob。
src/channels/plugins/contracts/test-helpers、src/plugin-sdk/test-helpers和src/plugins/contracts下的辅助工具编辑会使用本地导入图运行导入它们的测试,而不是在依赖路径精确时宽泛运行每个分片。 auto-reply拆分为三个专用配置(core、top-level、reply),这样 reply harness 不会压过较轻的顶层状态/token/辅助工具测试。- 选定的
plugin-sdk和commands测试文件会路由到专用轻量 lane,这些 lane 只保留test/setup.ts,将运行时重量级案例留在其现有 lane 上。 - 基础 Vitest 配置默认为
pool: "threads"和isolate: false,并在仓库配置中启用共享的非隔离 runner。 pnpm test:channels运行vitest.channels.config.ts。
Gateway 网关和 E2E
- Gateway 网关集成是可选启用的:
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm test或pnpm test:gateway。 pnpm test:e2e:仓库 E2E 聚合 =pnpm test:e2e:gateway && pnpm test:ui:e2e。pnpm test:e2e:gateway:Gateway 网关端到端冒烟测试(多实例 WS/HTTP/节点配对)。默认在vitest.e2e.config.ts中使用threads+isolate: false和自适应 worker;用OPENCLAW_E2E_WORKERS=<n>调整,用OPENCLAW_E2E_VERBOSE=1启用详细日志。pnpm test:live:提供商实时测试(Claude/Minimax/DeepSeek/z.ai 等,由*.live.test.ts控制)。需要 API 密钥和LIVE=1(或OPENCLAW_LIVE_TEST=1)才能取消跳过;用OPENCLAW_LIVE_TEST_QUIET=0输出详细内容。
完整 Docker 套件(pnpm test:docker:all)
构建共享实时测试镜像,将 OpenClaw 打包一次为 npm tar 包,构建/复用一个裸 Node/Git runner 镜像,以及一个把该 tar 包安装到 /app 的功能镜像,然后通过加权调度器运行 Docker 冒烟测试通道。scripts/package-openclaw-for-docker.mjs 是唯一的本地/CI 包打包器,并会在 Docker 使用之前验证 tar 包和 dist/postinstall-inventory.json。
- 裸镜像(
OPENCLAW_DOCKER_E2E_BARE_IMAGE):安装器/更新/插件依赖测试通道;挂载预构建 tar 包,而不是复制的仓库源代码。 - 功能镜像(
OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE):普通已构建应用功能测试通道。 - 测试通道定义:
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 计划(测试通道、镜像类型、包/实时镜像需求、状态场景、凭据检查),不会构建或运行 Docker。
| 环境变量 | 默认值 | 用途 |
|---|---|---|
OPENCLAW_DOCKER_ALL_PARALLELISM | 10 | 进程槽位。 |
OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM | 10 | 对提供商敏感的尾部池。 |
OPENCLAW_DOCKER_ALL_LIVE_LIMIT | 9 | 重型实时提供商测试通道上限。 |
OPENCLAW_DOCKER_ALL_NPM_LIMIT | 5 | npm 资源测试通道上限。 |
OPENCLAW_DOCKER_ALL_SERVICE_LIMIT | 7 | 服务资源测试通道上限。 |
OPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT / _CODEX_LIMIT / _GEMINI_LIMIT / _DROID_LIMIT / _OPENCODE_LIMIT | 4 | 每个提供商的重型测试通道上限。 |
OPENCLAW_DOCKER_ALL_LIVE_OPENAI_LIMIT / _TELEGRAM_LIMIT | 1 | 更窄的每提供商上限。 |
OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT / OPENCLAW_DOCKER_ALL_DOCKER_LIMIT | - | 用于更大主机的覆盖值。 |
OPENCLAW_DOCKER_ALL_START_STAGGER_MS | 2000 | 测试通道启动之间的延迟,避免本地 Docker daemon 创建风暴。 |
OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS | 7,200,000(120 分钟) | 每个测试通道的回退超时;选定的实时/尾部测试通道使用更严格的上限。 |
OPENCLAW_DOCKER_ALL_LIVE_RETRIES | 1 | 瞬时实时提供商失败的重试次数。 |
OPENCLAW_DOCKER_ALL_DRY_RUN | 关闭 | 打印测试通道清单,但不运行 Docker。 |
OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS | 30000 | 活跃测试通道状态打印间隔。 |
OPENCLAW_DOCKER_ALL_TIMINGS | 开启 | 复用 .artifacts/docker-tests/lane-timings.json 进行最长优先排序;设为 0 可禁用。 |
OPENCLAW_DOCKER_ALL_LIVE_MODE | - | skip 表示仅运行确定性/本地测试通道,only 表示仅运行实时提供商测试通道。别名:pnpm test:docker:local:all、pnpm test:docker:live:all。仅实时模式会把主实时测试通道和尾部实时测试通道合并为一个最长优先池,让提供商桶把 Claude/Codex/Gemini 工作打包在一起。 |
OPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS | 180 | CLI 后端 Docker 设置超时。 |
OPENCLAW_DOCKER_ALL_<RESOURCE>_LIMIT(资源名称大写,非字母数字字符折叠为 _)。
其他行为:runner 默认会预检 Docker,清理过期的 OpenClaw E2E 容器,在兼容测试通道之间共享提供商 CLI 工具缓存,并在第一次失败后停止调度新的池化测试通道,除非设置了 OPENCLAW_DOCKER_ALL_FAIL_FAST=0。如果某个测试通道在低并行度主机上超过有效的权重/资源上限,它仍然可以从空池启动并独占运行,直到释放容量。每个测试通道的日志、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> 打印低成本的定向重跑命令。
重要 Docker 测试通道
| 命令 | 验证 |
|---|---|
pnpm test:docker:browser-cdp-snapshot | 基于 Chromium 的源端到端容器,使用原始 CDP + 隔离的 Gateway 网关;browser doctor --deep CDP 角色快照包含链接 URL、由光标提升的可点击项、iframe 引用和框架元数据。 |
pnpm test:docker:skill-install | 在裸 Docker 运行器中安装打包后的 tarball,并设置 skills.install.allowUploadedArchives: false,从实时 ClawHub 搜索中解析当前 Skills slug,通过 openclaw skills install 安装,并验证 SKILL.md、.clawhub/origin.json、.clawhub/lock.json 和 skills info --json。 |
pnpm test:docker:live-cli-backend:claude, :claude:resume, :claude:mcp | 聚焦的 CLI 后端实时探测;Gemini 有对应的 :resume 和 :mcp 别名。 |
pnpm test:docker:openwebui | Docker 化的 OpenClaw + Open WebUI:登录、检查 /api/models,通过 /api/chat/completions 运行一次真实的代理聊天。需要可用的实时模型密钥并拉取外部镜像;不预期像单元/端到端套件那样在 CI 中稳定。 |
pnpm test:docker:mcp-channels | 已播种的 Gateway 网关容器,加上一个生成 openclaw mcp serve 的客户端容器:路由式对话发现、转录读取、附件元数据、实时事件队列行为、出站发送路由,以及通过真实 stdio 桥接传递的 Claude 风格渠道 + 权限通知(断言会直接读取原始 stdio MCP 帧)。 |
pnpm test:docker:upgrade-survivor | 将打包后的 tarball 安装到脏旧用户夹具之上,运行包更新和非交互式 Doctor(不使用实时提供商/渠道密钥),启动环回 Gateway 网关,并检查智能体/渠道配置/插件 allowlist/工作区/会话文件/陈旧旧版插件依赖状态/启动/RPC 状态是否保留。 |
pnpm test:docker:published-upgrade-survivor | 默认安装 openclaw@latest,播种真实的现有用户文件,通过内置的 openclaw config set 配方配置,更新到打包后的 tarball,运行非交互式 Doctor,写入 .artifacts/upgrade-survivor/summary.json,检查 /healthz、/readyz、RPC 状态。可用 OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC 覆盖,用 OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS 扩展矩阵,或用 OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues 添加场景夹具(包含 configured-plugin-installs 和 stale-source-plugin-shadow)。Package Acceptance 将这些公开为 published_upgrade_survivor_baseline(s) / _scenarios,并解析 last-stable-4 或 all-since-2026.4.23 等元令牌。 |
pnpm test:docker:update-migration | plugin-deps-cleanup 场景中的已发布升级幸存者 harness,默认从 openclaw@2026.4.23 开始。Update Migration 工作流使用 baselines=all-since-2026.4.23 扩展它,以证明完整发布 CI 之外的已配置插件依赖清理。 |
pnpm test:docker:plugins | 针对本地路径、file:、带提升依赖的 npm registry 包、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
测试性能工具
pnpm test:perf:imports:启用 Vitest 导入耗时 + 导入拆分报告,同时仍对显式文件/目录目标使用限定范围的 lane 路由。pnpm test:perf:imports:changed将相同的性能分析限定到自origin/main以来变更的文件。pnpm test:perf:changed:bench -- --ref <git-ref>会针对同一个已提交的 git diff,将路由后的 changed-mode 路径与原生根项目运行进行基准测试;pnpm test:perf:changed:bench -- --worktree会在无需先提交的情况下,对当前工作树变更集进行基准测试。pnpm test:perf:profile:main为 Vitest 主线程写入 CPU profile(.artifacts/vitest-main-profile);pnpm test:perf:profile:runner为单元运行器写入 CPU + heap profiles(.artifacts/vitest-runner-profile)。pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json:串行运行每个完整套件 Vitest 叶子配置,并写入分组耗时数据以及每个配置的 JSON/日志 artifacts。完整套件报告默认按文件隔离,因此早期文件保留的模块图和 GC 暂停不会计入后续断言;仅在有意分析共享 worker 累积时才传入-- --no-isolate。测试性能智能体在尝试修复慢测试前会将其用作基线。pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json会在面向性能的变更后比较分组报告。- 完整、插件和 include-pattern 分片运行会更新
.artifacts/vitest-shard-timings.json中的本地计时数据;之后的整个配置运行会使用这些计时来平衡慢速和快速分片。Include-pattern CI 分片会将分片名称追加到计时键,这会让过滤后的分片计时可见,同时不替换整个配置的计时数据。设置OPENCLAW_TEST_PROJECTS_TIMINGS=0可忽略本地计时 artifact。
基准测试
模型延迟(scripts/bench-model.ts)
模型延迟(scripts/bench-model.ts)
MINIMAX_API_KEY、MINIMAX_BASE_URL、MINIMAX_MODEL、ANTHROPIC_API_KEY。默认提示词:“用一个单词回复:ok。不要标点或额外文本。”CLI 启动(scripts/bench-cli-startup.ts)
CLI 启动(scripts/bench-cli-startup.ts)
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 配置文件。保存的输出:pnpm test:startup:bench:smoke 写入 .artifacts/cli-startup-bench-smoke.json;pnpm test:startup:bench:save 写入 .artifacts/cli-startup-bench-all.json(runs=5 warmup=1)。检入的夹具:test/fixtures/cli-startup-bench.json,由 pnpm test:startup:bench:update 刷新,由 pnpm test:startup:bench:check 比较。Gateway startup (scripts/bench-gateway-startup.ts)
Gateway startup (scripts/bench-gateway-startup.ts)
默认使用构建后的 CLI 入口 用例 ID:
dist/entry.js;请先运行 pnpm build。传入 --entry scripts/run-node.mjs 可改为测量源码运行器,并将这些结果与构建入口基线分开保存。default、skipChannels(跳过渠道启动)、oneInternalHook、allInternalHooks、fiftyPlugins(50 个清单插件)、fiftyStartupLazyPlugins(50 个启动延迟清单插件)。输出包含首次进程输出、/healthz、/readyz、HTTP 监听日志时间、Gateway 网关就绪日志时间、CPU 时间、CPU 核心比率、最大 RSS、堆、启动追踪指标、事件循环延迟,以及插件查找表详细指标。该脚本会在子 Gateway 网关环境中设置 OPENCLAW_GATEWAY_STARTUP_TRACE=1。/healthz 是存活性(HTTP 服务器可以响应)。/readyz 是可用就绪性(启动插件 sidecar、渠道和就绪关键的附加后工作已经稳定)。启动钩子会异步分发,不属于就绪性保证的一部分。就绪日志时间是 Gateway 网关的内部时间戳,适合用于进程侧归因,但不能替代外部 /readyz 探针。比较变更时使用 JSON 输出或 --output。只有在追踪输出指向导入、编译或 CPU 密集型工作,而阶段计时本身无法解释时,才使用 --cpu-prof-dir。Gateway restart (scripts/bench-gateway-restart.ts)
Gateway restart (scripts/bench-gateway-restart.ts)
仅限 macOS 和 Linux(使用 SIGUSR1 进行进程内重启;在 Windows 上会立即失败)。与上面的 Gateway 网关启动相同,默认使用构建入口,并可通过 用例 ID:
--entry scripts/run-node.mjs 覆盖。skipChannels、skipChannelsAcpxProbe(开启 ACPX 启动探针)、skipChannelsNoAcpxProbe(关闭探针)、default、fiftyPlugins。输出包含下一次 /healthz、下一次 /readyz、停机时间、重启就绪计时、CPU、RSS、替换进程的启动追踪指标,以及信号处理、活动工作清空、关闭阶段、下一次启动、就绪计时和内存快照的重启追踪指标。该脚本会设置 OPENCLAW_GATEWAY_STARTUP_TRACE=1 和 OPENCLAW_GATEWAY_RESTART_TRACE=1。当变更涉及重启信号、关闭处理器、重启后启动、sidecar 关闭、服务交接或重启后的就绪性时,使用此基准。先从 skipChannels 开始,将 Gateway 网关机制与渠道启动隔离;只有在窄用例解释了重启路径之后,才使用 default 或插件较多的用例。追踪指标是归因提示,不是结论;判断重启变更时,应基于多个样本、匹配的所有者跨度、/healthz//readyz 行为,以及用户可见的重启契约。新手引导 E2E(Docker)
可选;仅容器化新手引导冒烟测试需要。在干净的 Linux 容器中运行完整冷启动流程:openclaw health。