chore(i18n): refresh zh-CN translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-05-03 08:25:28 +00:00
parent efb4bdf463
commit 9b3a046801
2 changed files with 410 additions and 347 deletions

View File

@ -1,34 +1,34 @@
---
read_when:
- 更改 OpenClaw 更新、Doctor、软件包验收或插件安装行为
- 更改 OpenClaw 更新、Doctor、软件包验收或插件安装行为
- 准备或批准发布候选版本
- 调试包更新、插件依赖清理或插件安装回归问题
- 调试软件包更新、插件依赖清理或插件安装回归问题
sidebarTitle: Update and plugin tests
summary: OpenClaw 如何验证更新路径、包迁移插件安装/更新行为
summary: OpenClaw 如何验证更新路径、包迁移以及插件安装/更新行为
title: 更新和插件测试
x-i18n:
generated_at: "2026-05-02T18:56:28Z"
generated_at: "2026-05-03T08:22:52Z"
model: gpt-5.5
provider: openai
source_hash: 1a56e249f565cc23a439142b3332c0a57fd4afe9021b79f644d353946d6d2ffc
source_hash: 309ac7785a8d49db241989d28580887d3f6739982108af7148b624082c5f23dd
source_path: help/testing-updates-plugins.md
workflow: 16
---
这是更新和插件验证的专用清单。目标很简单:证明可安装包能够更新真实用户状态,通过 `doctor` 修复过时的旧版状态,并且仍然可以从受支持的来源安装、加载、更新和卸载插件。
这是用于更新和插件验证的专用检查清单。目标很简单:证明可安装的软件包能够更新真实用户状态,通过 `doctor` 修复陈旧的旧版状态,并且仍然可以从受支持的来源安装、加载、更新和卸载插件。
关于更广泛的测试运行器地图,请参阅 [测试](/zh-CN/help/testing)。关于实时提供商密钥和会触达网络的套件,请参阅 [实时测试](/zh-CN/help/testing-live)。
更广泛的测试运行器映射见 [测试](/zh-CN/help/testing)。实时提供商密钥和会触达网络的套件见 [实时测试](/zh-CN/help/testing-live)。
## 我们保护的内容
## 我们保护什么
更新和插件测试保护这些契约:
- 包 tarball 是完整的,具有有效的 `dist/postinstall-inventory.json`,并且不依赖未打包的仓库文件。
- 用户可以从较旧的已发布包迁移到候选包,而不会丢失配置、智能体、会话、工作区、插件允许列表或渠道配置。
- `openclaw doctor --fix --non-interactive` 负责旧版清理和修复路径。启动时不应为过时的插件状态增加隐藏的兼容性迁移。
- 插件安装可从本地目录、git 仓库、npm 包和 ClawHub 注册表路径运行
- 插件 npm 依赖安装在托管 npm 根目录中,在信任被扫描,并在卸载期间通过 npm 移除,因此提升安装的依赖不会残留。
- 插件更新在没有变化时保持稳定:安装记录、解析后的来源、已安装依赖布局和启用状态都保持不变。
- 软件包 tarball 是完整的,具有有效的 `dist/postinstall-inventory.json`,并且不依赖未打包的仓库文件。
- 用户可以从较旧的已发布软件包迁移到候选软件包,而不会丢失配置、智能体、会话、工作区、插件 allowlist 或渠道配置。
- `openclaw doctor --fix --non-interactive` 负责旧版清理和修复路径。启动过程不应为陈旧的插件状态增长隐藏的兼容性迁移。
- 插件可从本地目录、git 仓库、npm 软件包和 ClawHub 注册表路径安装
- 插件 npm 依赖安装在托管 npm 根目录中,在信任前被扫描,并在卸载期间通过 npm 移除,避免提升的依赖残留。
- 当没有任何变更时,插件更新应保持稳定:安装记录、解析后的来源、已安装依赖布局和启用状态都保持不变。
## 开发期间的本地证明
@ -40,43 +40,45 @@ pnpm check:changed
pnpm test:changed
```
对于插件安装、卸载、依赖或包清单变更,还要运行覆盖已编辑接缝的聚焦测试:
对于插件安装、卸载、依赖或软件包清单变更,还要运行覆盖已编辑接缝的聚焦测试:
```bash
pnpm test src/plugins/uninstall.test.ts src/infra/package-dist-inventory.test.ts test/scripts/package-acceptance-workflow.test.ts
```
在任何包 Docker 通道消费 tarball 之前,先证明包产物
在任何软件包 Docker lane 使用 tarball 之前,先证明软件包构件
```bash
pnpm release:check
```
`release:check` 会运行配置/文档/API 漂移检查,写入包 dist 清单,运行 `npm pack --dry-run`,拒绝禁止打包的文件,将 tarball 安装到临时前缀,运行 postinstall并对内置渠道入口点做冒烟测试。
`release:check` 会运行配置/文档/API 漂移检查,写入软件包 dist 清单,运行 `npm pack --dry-run`,拒绝禁止打包的文件,将 tarball 安装到临时前缀,运行 postinstall并对内置渠道入口点进行 smoke 测试。
## Docker 通道
## Docker lanes
Docker 通道是产品级证明。它们会在 Linux 容器内安装或更新真实包,并通过 CLI 命令、Gateway 网关启动、HTTP 探测、RPC 状态和文件系统状态断言行为。
Docker lanes 是产品级证明。它们在 Linux 容器内安装或更新真实软件包,并通过 CLI 命令、Gateway 网关启动、HTTP 探测、RPC 状态和文件系统状态断言行为。
迭代时使用聚焦通道
迭代时使用聚焦 lanes
```bash
pnpm test:docker:plugins
pnpm test:docker:plugin-lifecycle-matrix
pnpm test:docker:plugin-update
pnpm test:docker:upgrade-survivor
pnpm test:docker:published-upgrade-survivor
pnpm test:docker:update-migration
```
重要通道
重要 lanes
- `test:docker:plugins` 验证插件安装冒烟、本地文件夹安装、本地文件夹更新跳过行为、带预安装依赖的本地文件夹、`file:` 包安装、带 CLI 执行的 git 安装、git 移动引用更新、带提升安装传递依赖的 npm 注册表安装、npm 更新空操作、本地 ClawHub fixture 安装和更新空操作、市场更新行为,以及 Claude 捆绑包启用/检查。设置 `OPENCLAW_PLUGINS_E2E_CLAWHUB=0` 可让 ClawHub 块保持 hermetic/离线。
- `test:docker:plugin-update` 验证未更改的已安装插件在 `openclaw plugins update` 期间不会重新安装或丢失安装元数据。
- `test:docker:upgrade-survivor` 将候选 tarball 安装到脏的旧用户 fixture 之上,运行包更新和非交互式 doctor然后启动 local loopback Gateway 网关并检查状态保留。
- `test:docker:published-upgrade-survivor` 会先安装已发布的基线,通过烘焙好的 `openclaw config set` 配方配置它,将其更新到候选 tarball运行 doctor检查旧版清理启动 Gateway 网关,并探测 `/healthz`、`/readyz` 和 RPC 状态。
- `test:docker:update-migration` 是清理较重的已发布更新通道。它从已配置的 Discord/Telegram 风格用户状态开始,运行基线 doctor让已配置插件依赖有机会具现化为已配置的打包插件种入旧版插件依赖残留更新到候选 tarball并要求更新后的 doctor 移除旧版依赖根目录。
- `test:docker:plugins` 验证插件安装 smoke、本地文件夹安装、本地文件夹更新跳过行为、带预安装依赖的本地文件夹、`file:` 软件包安装、带 CLI 执行的 git 安装、git 移动引用更新、带提升传递依赖的 npm 注册表安装、npm 更新空操作、本地 ClawHub fixture 安装和更新空操作、marketplace 更新行为,以及 Claude bundle 启用/检查。设置 `OPENCLAW_PLUGINS_E2E_CLAWHUB=0` 可使 ClawHub 块保持 hermetic/离线。
- `test:docker:plugin-lifecycle-matrix` 在裸容器中安装候选软件包,让一个 npm 插件依次完成安装、检查、禁用、启用、显式升级、显式降级,以及删除插件代码后的卸载。它会记录每个阶段的 RSS 和 CPU 指标。
- `test:docker:plugin-update` 验证未变更的已安装插件在 `openclaw plugins update` 期间不会重新安装或丢失安装元数据。
- `test:docker:upgrade-survivor` 将候选 tarball 安装到脏旧用户 fixture 上,运行软件包更新和非交互式 doctor然后启动一个 local loopback Gateway 网关并检查状态保留。
- `test:docker:published-upgrade-survivor` 先安装一个已发布基线,通过内置的 `openclaw config set` 配方配置它,将其更新为候选 tarball运行 doctor检查旧版清理启动 Gateway 网关,并探测 `/healthz`、`/readyz` 和 RPC 状态。
- `test:docker:update-migration` 是清理密集型的已发布更新 lane。它从已配置的 Discord/Telegram 风格用户状态开始,运行基线 doctor让已配置的插件依赖有机会物化为已配置的打包插件播种旧版插件依赖残留更新到候选 tarball并要求更新后的 doctor 移除旧版依赖根目录。
有用的已发布升级幸存者变体:
有用的已发布升级 survivor 变体:
```bash
OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC=openclaw@2026.4.23 \
@ -88,9 +90,9 @@ OPENCLAW_UPGRADE_SURVIVOR_SCENARIO=bootstrap-persona \
pnpm test:docker:published-upgrade-survivor
```
可用场景包括 `base`、`feishu-channel`、`bootstrap-persona`、`plugin-deps-cleanup`、`configured-plugin-installs`、`tilde-log-path` 和 `versioned-runtime-deps`。在聚合运行中,`OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues` 会展为所有已报告问题形态的场景,包括已配置插件安装迁移。
可用场景包括 `base`、`feishu-channel`、`bootstrap-persona`、`plugin-deps-cleanup`、`configured-plugin-installs`、`tilde-log-path` 和 `versioned-runtime-deps`。在聚合运行中,`OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues` 会展为所有已报告问题形态的场景,包括已配置插件安装迁移。
完整更新迁移有意与完整发布 CI 分离。当发布问题是“从 `2026.4.23` 开始的每个已发布稳定版都能否更新到此候选版本并清理插件依赖残留?”时,使用手动 `Update Migration` 工作流:
完整更新迁移有意与 Full Release CI 分离。当发布问题是“从 2026.4.23 起的每个已发布稳定版本是否都能更新到此候选版本并清理插件依赖残留?”时,使用手动 `Update Migration` 工作流:
```bash
gh workflow run update-migration.yml \
@ -101,20 +103,20 @@ gh workflow run update-migration.yml \
-f scenarios=plugin-deps-cleanup
```
## 包验收
## Package Acceptance
包验收是 GitHub 原生的包门禁。它会将一个候选包解析为 `package-under-test` tarball记录版本和 SHA-256然后针对该精确 tarball 运行可复用 Docker E2E 通道。工作流 harness ref 与包源 ref 分离,因此当前测试逻辑可以验证较旧的可信发布。
Package Acceptance 是 GitHub 原生的软件包门禁。它将一个候选软件包解析为 `package-under-test` tarball记录版本和 SHA-256然后针对这个精确 tarball 运行可复用的 Docker E2E lanes。工作流 harness ref 与软件包源 ref 分离,因此当前测试逻辑可以验证较旧的受信任发布。
候选来源:
- `source=npm`:验证 `openclaw@beta`、`openclaw@latest` 或精确的已发布版本。
- `source=ref`:使用选定的当前 harness 打包可信分支、标签或提交。
- `source=url`:验证带必`package_sha256` 的 HTTPS tarball。
- `source=ref`:使用所选当前 harness 打包受信任的分支、标签或提交。
- `source=url`:验证需 `package_sha256` 的 HTTPS tarball。
- `source=artifact`:复用另一个 Actions 运行上传的 tarball。
完整发布验证默认使用 `source=artifact`,由解析后的发布 SHA 构建。对于发布后证明,传入 `package_acceptance_package_spec=openclaw@YYYY.M.D`使同一个升级矩阵目标指向已发布的 npm 包。
Full Release Validation 默认使用 `source=artifact`,从解析后的发布 SHA 构建。对于发布后证明,传入 `package_acceptance_package_spec=openclaw@YYYY.M.D`同一个升级矩阵目标指向已发布的 npm 软件包。
发布检查会使用包/更新/插件集合调用包验收
发布检查会使用 package/update/plugin 集合调用 Package Acceptance
```text
doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update
@ -128,11 +130,11 @@ published_upgrade_survivor_scenarios=reported-issues
telegram_mode=mock-openai
```
这会让包迁移、更新渠道切换、过时插件依赖清理、离线插件覆盖、插件更新行为和 Telegram 包 QA 都针对同一个解析产物运行
这会让软件包迁移、更新渠道切换、陈旧插件依赖清理、离线插件覆盖、插件更新行为和 Telegram 软件包 QA 绑定到同一个解析后的构件上
`all-since-2026.4.23`完整发布 CI 的升级样本:从 `2026.4.23``latest` 的每个 npm 已发布稳定版本。要获得详尽的已发布更新迁移覆盖,请在单独的更新迁移工作流中使用 `all-since-2026.4.23`,而不是完整发布 CI。`release-history` 仍可用于手动更广泛采样,适合同时需要旧版日期前锚点的情况。
`all-since-2026.4.23` Full Release CI 升级样本:从 `2026.4.23``latest` 的每个稳定 npm 已发布版本。要获得详尽的已发布更新迁移覆盖,请在单独的 Update Migration 工作流中使用 `all-since-2026.4.23`,而不是 Full Release CI。`release-history` 仍可用于手动更广泛抽样,适用于你也需要旧版日期前锚点的情况。
在发布前验证候选版本时,手动运行包配置档
在发布前验证候选版本时,手动运行软件包 profile
```bash
gh workflow run package-acceptance.yml \
@ -146,49 +148,49 @@ gh workflow run package-acceptance.yml \
-f telegram_mode=mock-openai
```
当发布问题包含 MCP 渠道、cron/subagent 清理、OpenAI Web 搜索或 OpenWebUI 时,使用 `suite_profile=product`。只有在需要完整 Docker 发布路径覆盖时,才使用 `suite_profile=full`
当发布问题包含 MCP 渠道、cron/subagent 清理、OpenAI web search 或 OpenWebUI 时,使用 `suite_profile=product`。仅在需要完整 Docker 发布路径覆盖时使用 `suite_profile=full`
## 发布默认值
对于发布候选版本,默认证明栈是:
1. 使`pnpm check:changed``pnpm test:changed` 检查源码级回归
2. 使`pnpm release:check` 检查包产物完整性
3. 使用包验收 `package` 配置档或发布检查自定义包通道检查安装/更新/插件契约
4. 使用跨 OS 发布检查验证 OS 特定安装器、新手引导和平台行为
5. 只有在变更表面触及提供商或托管服务行为时,才运行实时套件。
1. 用于源代码级回归的 `pnpm check:changed``pnpm test:changed`
2. 用于软件包构件完整性的 `pnpm release:check`
3. 用于安装/更新/插件契约的 Package Acceptance `package` profile 或 release-check 自定义软件包 lanes
4. 用于特定 OS 安装器、新手引导和平台行为的跨 OS 发布检查
5. 仅当变更面触及提供商或托管服务行为时运行实时套件。
在维护者机器上,宽范围门禁和 Docker/包产品证明应在 Testbox 中运行,除非明确要做本地证明。
在维护者机器上,广泛门禁和 Docker/软件包产品证明应在 Testbox 中运行,除非明确执行本地证明。
## 旧版兼容性
兼容性宽容范围很窄且有时间限制:
兼容性宽容范围很窄,并且有时间限制:
- 到 `2026.4.25` 为止的包,包括 `2026.4.25-beta.*`,可以在包验收中容忍已经发布的包元数据缺口。
- 已发布的 `2026.4.26` 包可以对已经发布的本地构建元数据戳文件发出警告。
- 后续包必须满足现代契约。同样的缺口会失败,而不是警告或跳过。
- `2026.4.25`软件包,包括 `2026.4.25-beta.*`,可以在 Package Acceptance 中容忍已经发布的软件包元数据缺口。
- 已发布的 `2026.4.26` 软件包可以对已经发布的本地构建元数据 stamp 文件发出警告。
- 后续软件包必须满足现代契约。同缺口会失败,而不是警告或跳过。
不要为这些旧形态添加新的启动迁移。添加或扩展 doctor 修复,然后用 `upgrade-survivor``published-upgrade-survivor` 证明。
不要为这些旧形态添加新的启动迁移。添加或扩展 doctor 修复,然后用 `upgrade-survivor``published-upgrade-survivor` 证明
## 添加覆盖
更改更新或插件行为时,在能够因正确原因失败的最低层添加覆盖:
- 纯路径或元数据逻辑:在源码旁边添加单元测试。
- 包清单或打包文件行为:`package-dist-inventory` 或 tarball 检查器测试。
- CLI 安装/更新行为Docker 通道断言或 fixture。
- 纯路径或元数据逻辑:源代码旁边的单元测试。
- 软件包清单或打包文件行为:`package-dist-inventory` 或 tarball 检查器测试。
- CLI 安装/更新行为Docker lane 断言或 fixture。
- 已发布版本迁移行为:`published-upgrade-survivor` 场景。
- 注册表/包来源行为:`test:docker:plugins` fixture 或 ClawHub fixture 服务器
- 依赖布局或清理行为同时断言运行时执行和文件系统边界。npm 依赖可能会提升安装到托管 npm 根目录下,因此测试应证明根目录会被扫描/清理,而不是假设存在包本地 `node_modules` 树。
- 注册表/软件包来源行为:`test:docker:plugins` fixture 或 ClawHub fixture server
- 依赖布局或清理行为同时断言运行时执行和文件系统边界。npm 依赖可能被提升到托管 npm 根目录下,所以测试应证明根目录已被扫描/清理,而不是假设存在软件包本地 `node_modules` 树。
新 Docker fixture 默认保持 hermetic。除非测试重点是实时注册表行为否则使用本地 fixture 注册表和假包。
默认保持新的 Docker fixtures hermetic。除非测试重点是实时注册表行为否则使用本地 fixture 注册表和伪软件包。
## 失败分诊
产物身份开始:
构件身份开始:
- 包验收 `resolve_package` 摘要来源、版本、SHA-256 和产物名称。
- Docker 产物:`.artifacts/docker-tests/**/summary.json`、`failures.json`、通道日志和重跑命令。
- 升级幸存者摘要:`.artifacts/upgrade-survivor/summary.json`,包括基线版本、候选版本、场景、阶段耗时和配方步骤。
- Package Acceptance `resolve_package` 摘要来源、版本、SHA-256 和构件名称。
- Docker 构件:`.artifacts/docker-tests/**/summary.json`、`failures.json`、lane 日志和重新运行命令。
- Upgrade survivor 摘要:`.artifacts/upgrade-survivor/summary.json`,包括基线版本、候选版本、场景、阶段耗时和配方步骤。
优先使用同一个包产物重跑失败的精确通道,而不是重跑整个发布总括流程。
优先使用相同软件包构件重新运行失败的精确 lane而不是重新运行整个发布总括流程。

View File

@ -1,45 +1,45 @@
---
read_when:
- 在本地或 CI 中运行测试
- 为模型/提供商缺陷添加回归测试
- 为模型/提供商错误添加回归测试
- 调试 Gateway 网关 + 智能体行为
summary: 测试工具包:unit/e2e/live 套件、Docker 运行器,以及每项测试覆盖的内容
summary: 测试工具包:单元/e2e/live 套件、Docker 运行器,以及每项测试涵盖的内容
title: 测试
x-i18n:
generated_at: "2026-05-02T20:01:33Z"
generated_at: "2026-05-03T08:22:51Z"
model: gpt-5.5
provider: openai
source_hash: a5bfbd2ea78b05ca23e97318943e0043645814d2aa4ccb7540a2bf7c601d0d09
source_hash: e7fb57bee958c4e6243f02193a657d7b19ca633c7a27f70eac6b590931390671
source_path: help/testing.md
workflow: 16
---
OpenClaw 有三套 Vitest 测试套件(单元/集成、e2e、live和少量 Docker 运行器。本文档是“我们如何测试”的指南:
OpenClaw 有三个 Vitest 套件(单元/集成、E2E、真实服务和一小组 Docker 运行器。本文档是一份“我们如何测试”的指南:
- 每个套件覆盖什么以及它刻意_不_覆盖什么
- 常见工作流(本地、推送前、调试)应运行哪些命令
- live 测试如何发现凭证并选择模型/提供商。
- 每个套件覆盖什么(以及它刻意 _不_ 覆盖什么)。
- 常见工作流要运行哪些命令(本地、推送前、调试)。
- 真实服务测试如何发现凭证并选择模型/提供商。
- 如何为真实世界的模型/提供商问题添加回归测试。
<Note>
**QA 栈qa-lab、qa-channel、live 传输通道)**在单独文档中说明
**QA 栈qa-lab、qa-channel、真实传输通道)**已单独记录
- [QA overview](/zh-CN/concepts/qa-e2e-automation) — 架构、命令界面、场景编写。
- [Matrix QA](/zh-CN/concepts/qa-matrix) — `pnpm openclaw qa matrix` 参考。
- [QA channel](/zh-CN/channels/qa-channel) — 仓库支持的场景使用的合成传输插件。
- [Matrix QA](/zh-CN/concepts/qa-matrix) — `pnpm openclaw qa matrix` 参考。
- [QA channel](/zh-CN/channels/qa-channel) — 仓库支持的场景使用的合成传输插件。
本页面覆盖常规测试套件和 Docker/Parallels 运行器。下面的 QA 专用运行器部分([QA-specific runners](#qa-specific-runners))列出了具体的 `qa` 调用,并指回上面的参考资料。
本页覆盖常规测试套件以及 Docker/Parallels 运行器。下面的 QA 专用运行器部分([QA 专用运行器](#qa-specific-runners))列出了具体的 `qa` 调用,并指回上面的参考资料。
</Note>
## 快速开始
大多数日子
大多数时候
- 完整门禁(推送前预期执行`pnpm build && pnpm check && pnpm check:test-types && pnpm test`
- 完整门禁(推送前的预期检查`pnpm build && pnpm check && pnpm check:test-types && pnpm test`
- 在资源充足的机器上更快运行本地完整套件:`pnpm test:max`
- 直接 Vitest 监听循环:`pnpm test:watch`
- 直接文件定向现在也会路由插件/渠道路径:`pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts`
- 当你在迭代单个失败时,优先使用定向运行
- 直接 Vitest 监听循环:`pnpm test:watch`
- 直接文件定向现在也会路由扩展/渠道路径:`pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts`
- 在迭代单个失败时,优先先运行有针对性的检查
- Docker 支持的 QA 站点:`pnpm qa:lab:up`
- Linux VM 支持的 QA 通道:`pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline`
@ -48,114 +48,109 @@ OpenClaw 有三套 Vitest 测试套件(单元/集成、e2e、live和少量
- 覆盖率门禁:`pnpm test:coverage`
- E2E 套件:`pnpm test:e2e`
调试真实提供商/模型时(需要真实凭证):
调试真实提供商/模型时(需要真实凭证):
- live 套件(模型 + Gateway 网关工具/图像探测`pnpm test:live`
- 安静地定向一个 live 文件:`pnpm test:live -- src/agents/models.profiles.live.test.ts`
- 运行时性能报告:调度 `OpenClaw Performance`
`live_gpt54=true` 用于一次真实的 `openai/gpt-5.4` 智能体轮次,或将
`deep_profile=true` 用于 Kova CPU/堆/跟踪工件。每日计划运行会在配置
`CLAWGRIT_REPORTS_TOKEN` 时,将 mock-provider、deep-profile 和 GPT 5.4
通道工件发布到 `openclaw/clawgrit-reports`。mock-provider 报告还包括源码级
Gateway 网关启动、内存、插件压力、重复 fake-model hello-loop 和 CLI 启动数据
- Docker live 模型扫描:`pnpm test:docker:live-models`
- 每个选定模型现在会运行一次文本轮次,以及一个小型文件读取风格探测
元数据声明支持 `image` 输入的模型还会运行一个小型图像轮次。
- 真实服务套件(模型 + Gateway 网关工具/图片探针`pnpm test:live`
- 安静地定向一个真实服务文件:`pnpm test:live -- src/agents/models.profiles.live.test.ts`
- 运行时性能报告:调度 `OpenClaw Performance`并设置
`live_gpt54=true` 以运行一次真实的 `openai/gpt-5.4` 智能体轮次,或设置
`deep_profile=true` 以生成 Kova CPU/堆/跟踪制品。每日定时运行会在配置
`CLAWGRIT_REPORTS_TOKEN` 时,将模拟提供商、深度性能分析和 GPT 5.4 通道制品发布到
`openclaw/clawgrit-reports`。模拟提供商报告还包含源码级 Gateway 网关启动、内存、
插件压力、重复假模型 hello-loop以及 CLI 启动数字
- Docker 真实服务模型扫描:`pnpm test:docker:live-models`
- 每个选中的模型现在会运行一个文本轮次以及一个小型文件读取风格探针
元数据声明支持 `image` 输入的模型还会运行一个微型图片轮次。
在隔离提供商失败时,可用 `OPENCLAW_LIVE_MODEL_FILE_PROBE=0`
`OPENCLAW_LIVE_MODEL_IMAGE_PROBE=0` 禁用额外探
- CI 覆盖:每日 `OpenClaw Scheduled Live And E2E Checks` 和手动
`OpenClaw Release Checks` 都会`include_live_suites: true` 调用可复用 live/E2E 工作流,
其中包含按提供商分片的独立 Docker live 模型矩阵作业。
- 对于聚焦的 CI 重,调度 `OpenClaw Live And E2E Checks (Reusable)`
`OPENCLAW_LIVE_MODEL_IMAGE_PROBE=0` 禁用额外探
- CI 覆盖范围:每日 `OpenClaw Scheduled Live And E2E Checks` 和手动
`OpenClaw Release Checks` 都会调用可复用的真实服务/E2E 工作流,并设置
`include_live_suites: true`,其中包含按提供商分片的独立 Docker 真实服务模型矩阵作业。
- 对于聚焦的 CI 重新运行,调度 `OpenClaw Live And E2E Checks (Reusable)`
并设置 `include_live_suites: true``live_models_only: true`
- 将新的高信号提供商密钥添加到 `scripts/ci-hydrate-live-auth.sh`
以及 `.github/workflows/openclaw-live-and-e2e-checks-reusable.yml` 和它的计划/发布调用方。
以及 `.github/workflows/openclaw-live-and-e2e-checks-reusable.yml` 和它的
定时/发布调用方。
- 原生 Codex 绑定聊天冒烟测试:`pnpm test:docker:live-codex-bind`
- 针对 Codex app-server 路径运行 Docker live 通道,绑定一个带 `/codex bind` 的合成
Slack 私信,执行 `/codex fast``/codex permissions`,然后验证普通回复和图像附件
通过原生插件绑定路由,而不是通过 ACP。
- Codex app-server harness 冒烟测试:`pnpm test:docker:live-codex-harness`
- 通过插件自有的 Codex app-server harness 运行 Gateway 网关智能体轮次,
验证 `/codex status``/codex models`并默认执行图像、cron MCP、子智能体和 Guardian 探测。
在隔离其他 Codex app-server 失败时,可用
`OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0` 禁用子智能体探测。对于聚焦的子智能体检查,禁用其他探测:
- 针对 Codex 应用服务器路径运行一个 Docker 真实服务通道,使用 `/codex bind` 绑定一个合成
Slack 私信,执行 `/codex fast``/codex permissions`,然后验证一条普通回复和一个图片附件会通过原生插件绑定而不是 ACP 路由。
- Codex 应用服务器 harness 冒烟测试:`pnpm test:docker:live-codex-harness`
- 通过插件拥有的 Codex 应用服务器 harness 运行 Gateway 网关智能体轮次,
验证 `/codex status``/codex models`并默认执行图片、cron MCP、子智能体和 Guardian 探针。
在隔离其他 Codex 应用服务器失败时,可用
`OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0` 禁用子智能体探针。对于聚焦的子智能体检查,禁用其他探针:
`OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=1 pnpm test:docker:live-codex-harness`
除非设置 `OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0`,否则它会在子智能体探后退出。
除非设置 `OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0`,否则它会在子智能体探针之后退出。
- Crestodian 救援命令冒烟测试:`pnpm test:live:crestodian-rescue-channel`
- 针对消息渠道救援命令界面的可选双重检查。它会执行 `/crestodian status`
排队一个持久模型更改,回复 `/crestodian yes`,并验证审计/配置写入路径。
- 可选的双保险检查,用于消息渠道救援命令界面。它会执行 `/crestodian status`,排队一个持久模型变更,回复 `/crestodian yes`,并验证审计/配置写入路径。
- Crestodian 规划器 Docker 冒烟测试:`pnpm test:docker:crestodian-planner`
- 在无配置容器中运行 Crestodian`PATH` 上带有假的 Claude CLI
验证模糊规划器回退会转换为经过审计的类型化配置写入。
- 在无配置容器中运行 Crestodian并在 `PATH` 上放置一个假的 Claude CLI
验证模糊规划器回退会转换为一个经过审计的类型化配置写入。
- Crestodian 首次运行 Docker 冒烟测试:`pnpm test:docker:crestodian-first-run`
- 从空 OpenClaw 状态目录开始,将裸 `openclaw` 路由到
- 从空 OpenClaw 状态目录开始,将裸 `openclaw` 路由到
Crestodian应用设置/模型/智能体/Discord 插件 + SecretRef 写入,
验证配置,并验证审计条目。相同的 Ring 0 设置路径也由 QA Lab 中的
验证配置,并验证审计条目。同一个 Ring 0 设置路径也由 QA Lab 中的
`pnpm openclaw qa suite --scenario crestodian-ring-zero-setup` 覆盖。
- Moonshot/Kimi 成本冒烟测试:设置 `MOONSHOT_API_KEY` 后,运行
`openclaw models list --provider moonshot --json`,然后针对
`moonshot/kimi-k2.6` 运行一个隔离的
`openclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --json`
验证 JSON 报告 Moonshot/K2.6,并且助手转录存储规范化`usage.cost`
验证 JSON 报告 Moonshot/K2.6,并且助手转录存储规范化的 `usage.cost`
<Tip>
当你只需要一个失败用例时,优先通过下面描述的 allowlist 环境变量缩小 live 测试范围
当你只需要一个失败案例时,优先通过下面描述的 allowlist 环境变量收窄真实服务测试
</Tip>
## QA 专用运行器
当你需要 QA-lab 真实度时,这些命令与主测试套件并列
当你需要 QA-lab 真实感时,这些命令与主测试套件并列使用
CI 在专用工作流中运行 QA Lab。Agentic parity 嵌套在
CI 在专用工作流中运行 QA Lab。Agentic parity 嵌套在
`QA-Lab - All Lanes` 和发布验证下,而不是独立的 PR 工作流。
广泛验证应使用 `Full Release Validation`,并设置
`rerun_group=qa-parity`,或使用 release-checks QA 组。`QA-Lab - All Lanes`
每晚在 `main` 上运行,也可通过手动调度运行,并将 mock parity 通道、live
Matrix 通道、Convex 管理的 live Telegram 通道和 Convex 管理的 live Discord
通道作为并行作业。计划 QA 和发布检查会显式传递 Matrix
`--profile fast`,而 Matrix CLI 和手动工作流输入默认值仍为 `all`;手动调度可以将 `all`
分片为 `transport`、`media`、`e2ee-smoke`、`e2ee-deep` 和 `e2ee-cli` 作业。
`OpenClaw Release Checks` 会在发布批准前运行 parity以及 fast Matrix 和 Telegram
通道,发布传输检查使用 `mock-openai/gpt-5.5`,以便保持确定性并避免正常提供商插件启动。
这些 live 传输 Gateway 网关会禁用记忆搜索;记忆行为仍由 QA parity 套件覆盖。
会在 `main` 上每晚运行,也可通过手动调度运行,其中模拟 parity 通道、真实 Matrix 通道、Convex 管理的真实 Telegram 通道,以及 Convex 管理的真实 Discord 通道会作为并行作业运行。定时 QA 和发布检查会显式传递 Matrix
`--profile fast`,而 Matrix CLI 和手动工作流输入默认值仍为 `all`;手动调度可以将 `all` 分片为 `transport`
`media`、`e2ee-smoke`、`e2ee-deep` 和 `e2ee-cli` 作业。`OpenClaw Release
Checks` 会在发布批准前运行 parity 以及快速 Matrix 和 Telegram 通道,并为发布传输检查使用 `mock-openai/gpt-5.5`,以保持确定性并避免正常的提供商插件启动。这些真实传输
Gateway 网关会禁用记忆搜索;记忆行为仍由 QA parity 套件覆盖。
完整发布 live 媒体分片使用
完整发布真实媒体分片使用
`ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`,其中已经包含
`ffmpeg``ffprobe`。Docker live 模型/后端分片使用共享的
`ghcr.io/openclaw/openclaw-live-test:<sha>` 镜像,该镜像针对每个选定提交只构建一次,
然后使用 `OPENCLAW_SKIP_DOCKER_BUILD=1` 拉取它,而不是在每个分片内部重新构建。
`ffmpeg``ffprobe`。Docker 真实服务模型/后端分片使用共享的
`ghcr.io/openclaw/openclaw-live-test:<sha>` 镜像,该镜像会为每个选中的提交构建一次,然后通过 `OPENCLAW_SKIP_DOCKER_BUILD=1` 拉取它,而不是在每个分片内重新构建。
- `pnpm openclaw qa suite`
- 直接在主机上运行由仓库支的 QA 场景。
- 默认使用隔离的 Gateway 网关 worker 并行运行多个已选场景。`qa-channel` 默认并发数为 4受已选场景数量限制。使用 `--concurrency <count>` 调整 worker 数量,或使用 `--concurrency 1` 进入较旧的串行通道。
- 任何场景失败时以非零状态退出。当你想获取构件但不希望失败退出码时,使用 `--allow-failures`
- 支持提供商模式 `live-frontier`、`mock-openai` 和 `aimock`。`aimock` 会启动一个本地 AIMock 支持的提供商服务器,用于实验性的 fixture 和协议 mock 覆盖,而不会替代可感知场景`mock-openai` 通道。
- 直接在主机上运行由仓库支的 QA 场景。
- 默认使用隔离的 Gateway 网关工作进程并行运行多个选定场景。`qa-channel` 默认并发数为 4受选定场景数量限制。使用 `--concurrency <count>` 调整工作进程数量,或使用 `--concurrency 1` 运行旧版串行通道。
- 任何场景失败时以非零状态退出。当你想要产物但不想要失败退出码时,使用 `--allow-failures`
- 支持提供商模式 `live-frontier`、`mock-openai` 和 `aimock`。`aimock` 会启动一个由本地 AIMock 支撑的提供商服务器,用于实验性的夹具和协议模拟覆盖,而不会替代具备场景感知能力`mock-openai` 通道。
- `pnpm test:gateway:cpu-scenarios`
- 运行 Gateway 网关启动基准测试,加上一小组 mock QA Lab 场景包(`channel-chat-baseline`、`memory-failure-fallback`、`gateway-restart-inflight-run`),并在 `.artifacts/gateway-cpu-scenarios/` 下写入合并后的 CPU 观摘要。
- 默认只标记持续的高 CPU 观察结果`--cpu-core-warn` 加 `--hot-wall-warn-ms`),因此短暂的启动峰值会记录为指标,而不会看起来像持续数分钟的 Gateway 网关占满回归。
- 使用已构建的 `dist` 构件;当检出内容中尚无最新运行时输出时,请先运行构建。
- 运行 Gateway 网关启动基准测试,以及一小组模拟 QA Lab 场景包(`channel-chat-baseline`、`memory-failure-fallback`、`gateway-restart-inflight-run`),并在 `.artifacts/gateway-cpu-scenarios/` 下写入合并后的 CPU 观摘要。
- 默认只标记持续的高 CPU 观`--cpu-core-warn` 加 `--hot-wall-warn-ms`),因此短暂的启动峰值会记录为指标,而不会看起来像持续数分钟的 Gateway 网关占满 CPU 回归。
- 使用构建后的 `dist` 产物;当检出内容中还没有新的运行时输出时,请先运行构建。
- `pnpm openclaw qa suite --runner multipass`
- 在一次性 Multipass Linux VM 内运行同一 QA 套件。
- 在一次性 Multipass Linux VM 内运行同一 QA 套件。
- 保持与主机上的 `qa suite` 相同的场景选择行为。
- 复用与 `qa suite` 相同的提供商/模型选择标志。
- 实时运行会转发适合 guest 使用的受支持 QA 认证输入:基于环境的提供商密钥、QA 实时提供商配置路径,以及存在时的 `CODEX_HOME`
- 输出目录必须位于仓库根目录下,以便 guest 可以通过挂载的工作区写回。
- 在 `.artifacts/qa-e2e/...` 下写入常规 QA 报告 + 摘要以及 Multipass 日志。
- 实时运行会转发适合 guest 使用的受支持 QA 凭证输入:基于环境变量的提供商密钥、QA 实时提供商配置路径,以及存在时的 `CODEX_HOME`
- 输出目录必须位于仓库根目录下,这样 guest 才能通过挂载的工作区写回。
- 在 `.artifacts/qa-e2e/...` 下写入常规 QA 报告和摘要,以及 Multipass 日志。
- `pnpm qa:lab:up`
- 启动由 Docker 支的 QA 站点,用于操作员风格的 QA 工作。
- 启动由 Docker 支的 QA 站点,用于操作员风格的 QA 工作。
- `pnpm test:docker:npm-onboard-channel-agent`
- 从当前检出内容构建 npm tarball在 Docker 中全局安装,运行非交互式 OpenAI API key 新手引导,默认配置 Telegram验证打包后的插件运行时无需启动依赖修复即可加载,运行 Doctor并针对 mock 的 OpenAI 端点运行一次本地智能体回合
- 使用 `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` 以 Discord 运行同一个打包安装通道。
- 从当前检出内容构建 npm tarball在 Docker 中全局安装,运行非交互式 OpenAI API key 新手引导,默认配置 Telegram验证打包后的插件运行时在没有启动依赖修复的情况下加载,运行 Doctor并针对模拟的 OpenAI 端点运行一次本地智能体轮次
- 使用 `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` 以 Discord 运行相同的打包安装通道。
- `pnpm test:docker:session-runtime-context`
- 为嵌入式运行时上下文 transcript 运行确定性的已构建应用 Docker smoke。它会验证隐藏的 OpenClaw 运行时上下文被持久化为非显示自定义消息,而不是泄漏到可见的用户回合中,然后播种一个受影响的损坏会话 JSONL并验证 `openclaw doctor --fix` 将其重写到 active 分支并创建备份。
- 为嵌入式运行时上下文转录运行确定性的已构建应用 Docker 冒烟测试。它会验证隐藏的 OpenClaw 运行时上下文被持久化为非显示自定义消息,而不是泄漏到可见的用户轮次中;随后播种一个受影响的损坏会话 JSONL并验证 `openclaw doctor --fix` 会将其重写到活动分支并创建备份。
- `pnpm test:docker:npm-telegram-live`
- 在 Docker 中安装一个 OpenClaw 包候选版本,运行已安装包的新手引导,通过已安装的 CLI 配置 Telegram然后复用实时 Telegram QA 通道,并将该已安装包作为 SUT Gateway 网关。
- 默认值为 `OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta`;设置 `OPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgz``OPENCLAW_CURRENT_PACKAGE_TGZ`测试已解析的本地 tarball而不是从 registry 安装。
- 使用与 `pnpm openclaw qa telegram` 相同的 Telegram 环境凭证或 Convex 凭证来源。对于 CI/发布自动化,设置 `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex`再加上 `OPENCLAW_QA_CONVEX_SITE_URL` 和角色密钥。如果 CI 中存在 `OPENCLAW_QA_CONVEX_SITE_URL` 和 Convex 角色密钥Docker wrapper 会自动选择 Convex。
- `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainer` 为此通道覆盖共享的 `OPENCLAW_QA_CREDENTIAL_ROLE`
- GitHub Actions 将此通道暴露为手动维护者 workflow `NPM Telegram Beta E2E`。它不会在 merge 时运行。该 workflow 使用 `qa-live-shared` 环境和 Convex CI 凭证租约。
- GitHub Actions 还暴露 `Package Acceptance`,用于针对一个候选包进行旁路产品验证。它接受受信任 ref、已发布 npm spec、HTTPS tarball URL 加 SHA-256或来自另一次运行的 tarball 构件,上传规范化的 `openclaw-current.tgz` 作为 `package-under-test`,然后使用 smoke、package、product、full 或 custom 通道 profile 运行现有 Docker E2E 调度器。设置 `telegram_mode=mock-openai``live-frontier`可针对同一个 `package-under-test` 构件运行 Telegram QA workflow
- 最新 beta 产品证:
- 默认使用 `OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta`;设置 `OPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgz``OPENCLAW_CURRENT_PACKAGE_TGZ`测试已解析的本地 tarball而不是从 registry 安装。
- 使用与 `pnpm openclaw qa telegram` 相同的 Telegram 环境变量凭证或 Convex 凭证来源。对于 CI/发布自动化,设置 `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex`以及 `OPENCLAW_QA_CONVEX_SITE_URL` 和角色 secret。如果 CI 中存在 `OPENCLAW_QA_CONVEX_SITE_URL` 和 Convex 角色 secretDocker 包装器会自动选择 Convex。
- `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainer` 为此通道覆盖共享的 `OPENCLAW_QA_CREDENTIAL_ROLE`
- GitHub Actions 将此通道公开为手动维护者工作流 `NPM Telegram Beta E2E`。它不会在合并时运行。该工作流使用 `qa-live-shared` 环境和 Convex CI 凭证租约。
- GitHub Actions 还公开了 `Package Acceptance`,用于针对一个候选包进行旁路运行的产品证明。它接受可信 ref、已发布的 npm spec、HTTPS tarball URL 加 SHA-256或来自另一次运行的 tarball artifact上传规范化后的 `openclaw-current.tgz` 作为 `package-under-test`,然后以 smoke、package、product、full 或 custom 通道配置文件运行现有 Docker E2E 调度器。设置 `telegram_mode=mock-openai``live-frontier`即可针对同一个 `package-under-test` artifact 运行 Telegram QA 工作流
- 最新 beta 产品证
```bash
gh workflow run package-acceptance.yml --ref main \
@ -165,7 +160,7 @@ gh workflow run package-acceptance.yml --ref main \
-f telegram_mode=mock-openai
```
- 精确 tarball URL 证需要摘要:
- 精确 tarball URL 证需要摘要:
```bash
gh workflow run package-acceptance.yml --ref main \
@ -175,7 +170,7 @@ gh workflow run package-acceptance.yml --ref main \
-f suite_profile=package
```
- 构件验证会从另一次 Actions 运行下载 tarball 构件
- Artifact 证明会从另一次 Actions 运行下载 tarball artifact
```bash
gh workflow run package-acceptance.yml --ref main \
@ -186,44 +181,44 @@ gh workflow run package-acceptance.yml --ref main \
```
- `pnpm test:docker:plugins`
- 在 Docker 中打包并安装当前 OpenClaw 构建,启动配置 OpenAI 的 Gateway 网关,然后通过配置编辑启用内置渠道/插件。
- 验证设置发现会让未配置的可下载插件保持缺失,第一次配置的 Doctor 修复会显式安装每个缺失的可下载插件,并且第二次重启不会运行隐藏依赖修复。
- 还会安装一个已知的旧 npm 基线,在运行 `openclaw update --tag <candidate>` 前启用 Telegram并验证候选版本的更新后 Doctor 会清理旧插件依赖残留,而无需 harness 侧 postinstall 修复。
- 在 Docker 中打包并安装当前 OpenClaw 构建,启动配置 OpenAI 的 Gateway 网关,然后通过配置编辑启用内置渠道/插件。
- 验证设置发现会让未配置的可下载插件保持缺失状态,第一次配置的 Doctor 修复会显式安装每个缺失的可下载插件,并且第二次重启不会运行隐藏依赖修复。
- 还会安装一个已知的旧 npm 基线,在运行 `openclaw update --tag <candidate>` 前启用 Telegram并验证候选版本的更新后 Doctor 会清理旧插件依赖残留,而无需 harness 侧 postinstall 修复。
- `pnpm test:parallels:npm-update`
- 跨 Parallels guest 运行原生打包安装更新 smoke。每个已选平台会先安装请求的基线包,然后在同一 guest 中运行已安装的 `openclaw update` 命令并验证已安装版本、更新状态、Gateway 网关就绪情况,以及一个本地智能体回合
- 在迭代单个 guest 时使用 `--platform macos`、`--platform windows` 或 `--platform linux`。使用 `--json` 获取摘要构件路径和每条通道状态。
- OpenAI 通道默认使用 `openai/gpt-5.5` 进行实时智能体回合验证。有意验证另一个 OpenAI 模型时,传入 `--model <provider/model>` 或设置 `OPENCLAW_PARALLELS_OPENAI_MODEL`
- 用主机 timeout 包裹较长的本地运行,避免 Parallels 传输停滞耗尽剩余测试窗口:
- 跨 Parallels guest 运行原生打包安装更新冒烟测试。每个选定平台会先安装请求的基线包,然后在同一 guest 中运行已安装的 `openclaw update` 命令并验证已安装版本、更新状态、Gateway 网关就绪状态,以及一次本地智能体轮次
- 在迭代单个 guest 时使用 `--platform macos`、`--platform windows` 或 `--platform linux`。使用 `--json` 获取摘要 artifact 路径和各通道状态。
- OpenAI 通道默认使用 `openai/gpt-5.5` 进行实时智能体轮次证明。当你有意验证另一个 OpenAI 模型时,传入 `--model <provider/model>` 或设置 `OPENCLAW_PARALLELS_OPENAI_MODEL`
- 用主机 timeout 包裹长时间本地运行,避免 Parallels 传输卡顿耗尽剩余测试窗口:
```bash
timeout --foreground 150m pnpm test:parallels:npm-update -- --json
timeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json
```
- 该脚本会在 `/tmp/openclaw-parallels-npm-update.*` 下写入嵌套通道日志。在假设外层 wrapper 挂起之前,先检查 `windows-update.log`、`macos-update.log` 或 `linux-update.log`
- 在冷 guest 上Windows 更新可能在更新后 Doctor 和包更新工作中花费 10 到 15 分钟;只要嵌套 npm debug 日志仍在推进,这仍然是健康状态。
- 不要将此聚合 wrapper 与单独的 Parallels macOS、Windows 或 Linux smoke 通道并行运行。它们共享 VM 状态,可能在快照恢复、包服务或 guest Gateway 网关状态上发生冲突。
- 更新后验证会运行常规内置插件表面,因为 speech、图像生成和媒体理解等能力 facade 会通过内置运行时 API 加载,即使智能体回合本身只检查简单文本响应。
- 该脚本会在 `/tmp/openclaw-parallels-npm-update.*` 下写入嵌套通道日志。先检查 `windows-update.log`、`macos-update.log` 或 `linux-update.log`,再判断外层包装器是否卡住
- Windows 更新在冷 guest 上可能会花费 10 到 15 分钟执行更新后 Doctor 和包更新工作;只要嵌套 npm 调试日志仍在推进,这仍然是健康状态。
- 不要将这个聚合包装器与单独的 Parallels macOS、Windows 或 Linux 冒烟通道并行运行。它们共享 VM 状态,可能在快照恢复、包服务或 guest Gateway 网关状态上发生冲突。
- 更新后证明会运行常规内置插件表面,因为语音、图像生成和媒体理解等能力外观是通过内置运行时 API 加载的,即使智能体轮次本身只检查简单文本响应。
- `pnpm openclaw qa aimock`
- 仅启动本地 AIMock 提供商服务器,用于直接协议 smoke 测试。
- 只启动本地 AIMock 提供商服务器,用于直接协议冒烟测试。
- `pnpm openclaw qa matrix`
- 针对一次性 Docker 支持的 Tuwunel homeserver 运行 Matrix 实时 QA 通道。仅源代码检出可用 — 打包安装不会发布 `qa-lab`
- 完整 CLI、profile/场景目录、环境变量和构件布局:[Matrix QA](/zh-CN/concepts/qa-matrix)。
- 针对一次性 Docker 支撑的 Tuwunel homeserver 运行 Matrix 实时 QA 通道。仅限源码检出使用 — 打包安装不会随附 `qa-lab`
- 完整 CLI、配置文件/场景目录、环境变量和 artifact 布局:[Matrix QA](/zh-CN/concepts/qa-matrix)。
- `pnpm openclaw qa telegram`
- 使用来自环境的 driver 和 SUT bot token针对真实私有群组运行 Telegram 实时 QA 通道。
- 需要 `OPENCLAW_QA_TELEGRAM_GROUP_ID`、`OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN` 和 `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`。群组 id 必须是数字 Telegram chat id。
- 支持用于共享池化凭证的 `--credential-source convex`。默认使用环境模式,或设置 `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`启用池化租约。
- 任何场景失败时以非零状态退出。当你想获取构件但不希望失败退出码时,使用 `--allow-failures`
- 需要同一私有群组中的两个不同 bot并且 SUT bot 需要暴露 Telegram 用户名。
- 为了获得稳定的 bot 到 bot 观察,请在 `@BotFather` 中为两个 bot 启用 Bot-to-Bot Communication Mode并确保 driver bot 可以观察群组 bot 流量。
- 在 `.artifacts/qa-e2e/...` 下写入 Telegram QA 报告、摘要和 observed-messages 构件。回复场景包含从 driver 发送请求到观察到 SUT 回复的 RTT。
- 使用来自环境变量的驱动和 SUT bot token针对真实私有群组运行 Telegram 实时 QA 通道。
- 需要 `OPENCLAW_QA_TELEGRAM_GROUP_ID`、`OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN` 和 `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`。群组 id 必须是数字形式的 Telegram chat id。
- 支持 `--credential-source convex` 以使用共享池化凭证。默认使用环境变量模式,或设置 `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`选择池化租约。
- 任何场景失败时以非零状态退出。当你想要产物但不想要失败退出码时,使用 `--allow-failures`
- 需要同一私有群组中的两个不同 bot并且 SUT bot 需要暴露 Telegram 用户名。
- 为了获得稳定的 bot 到 bot 观测,请在 `@BotFather` 中为两个 bot 启用 Bot-to-Bot Communication Mode并确保驱动 bot 能观测群组 bot 流量。
- 在 `.artifacts/qa-e2e/...` 下写入 Telegram QA 报告、摘要和已观测消息 artifact。回复类场景包含从驱动发送请求到观测到 SUT 回复的 RTT。
实时传输通道共享一个标准契约,以防新传输发生偏移;每通道覆盖矩阵位于 [QA overview → 实时传输覆盖](/zh-CN/concepts/qa-e2e-automation#live-transport-coverage)。`qa-channel` 是广泛的合成套件,不属于该矩阵
实时传输通道共享一个标准契约,这样新的传输协议不会漂移;每个通道的覆盖矩阵位于 [QA overview → 实时传输覆盖范围](/zh-CN/concepts/qa-e2e-automation#live-transport-coverage)。`qa-channel` 是宽范围的合成套件,不属于该矩阵的一部分
### 通过 Convex 共享 Telegram 凭证v1
当为 `openclaw qa telegram` 启用 `--credential-source convex`(或 `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`QA lab 会从 Convex 支的池中获取独占租约,在通道运行期间对该租约发送 Heartbeat并在关闭时释放租约。
当为 `openclaw qa telegram` 启用 `--credential-source convex`(或 `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`QA lab 会从 Convex 支的池中获取独占租约,在通道运行期间对该租约发送 Heartbeat并在关闭时释放租约。
参考 Convex 项目脚手架:
@ -232,12 +227,12 @@ gh workflow run package-acceptance.yml --ref main \
必需环境变量:
- `OPENCLAW_QA_CONVEX_SITE_URL`(例如 `https://your-deployment.convex.site`
- 所选角色的一个密钥
- 所选角色的一个 secret
- `OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` 用于 `maintainer`
- `OPENCLAW_QA_CONVEX_SECRET_CI` 用于 `ci`
- 凭证角色选择:
- CLI`--credential-role maintainer|ci`
- 环境默认值:`OPENCLAW_QA_CREDENTIAL_ROLE`CI 中默认为 `ci`,否则为 `maintainer`
- 环境变量默认值:`OPENCLAW_QA_CREDENTIAL_ROLE`CI 中默认为 `ci`,否则默认`maintainer`
可选环境变量:
@ -246,14 +241,14 @@ gh workflow run package-acceptance.yml --ref main \
- `OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS`(默认 `90000`
- `OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS`(默认 `15000`
- `OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX`(默认 `/qa-credentials/v1`
- `OPENCLAW_QA_CREDENTIAL_OWNER_ID`(可选 trace id
- `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` 允许仅用于本地开发的 loopback `http://` Convex URL。
- `OPENCLAW_QA_CREDENTIAL_OWNER_ID`(可选跟踪 id
- `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` 允许在仅本地开发中使用 loopback `http://` Convex URL。
正常运行时,`OPENCLAW_QA_CONVEX_SITE_URL` 应使用 `https://`
`OPENCLAW_QA_CONVEX_SITE_URL` 在正常操作中应使用 `https://`
维护者管理命令(池 add/remove/list需要专门使用 `OPENCLAW_QA_CONVEX_SECRET_MAINTAINER`
维护者管理命令(池 add/remove/list特别需要 `OPENCLAW_QA_CONVEX_SECRET_MAINTAINER`
维护者 CLI helper
维护者 CLI 帮助命令
```bash
pnpm openclaw qa credentials doctor
@ -262,20 +257,20 @@ pnpm openclaw qa credentials list --kind telegram
pnpm openclaw qa credentials remove --credential-id <credential-id>
```
在实时运行前使用 `doctor` 检查 Convex site URL、broker 密钥、endpoint prefix、HTTP timeout 和 admin/list 可达性,且不会打印密钥值。在脚本和 CI 工具中使用 `--json` 获取机器可读输出。
在实时运行前使用 `doctor` 检查 Convex 站点 URL、broker secret、端点前缀、HTTP timeout以及 admin/list 可达性,且不会打印 secret 值。在脚本和 CI 实用工具中使用 `--json` 获取机器可读输出。
默认端点契约(`OPENCLAW_QA_CONVEX_SITE_URL` + `/qa-credentials/v1`
- `POST /acquire`
- 请求:`{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs }`
- 成功:`{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? }`
- 耗尽/可重试:`{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }`
- 耗尽/可重试:`{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }`
- `POST /heartbeat`
- 请求:`{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs }`
- 成功:`{ status: "ok" }`(或空 `2xx`
- 成功:`{ status: "ok" }`(或空 `2xx`
- `POST /release`
- 请求:`{ kind, ownerId, actorRole, credentialId, leaseToken }`
- 成功:`{ status: "ok" }`(或空 `2xx`
- 成功:`{ status: "ok" }`(或空 `2xx`
- `POST /admin/add`(仅维护者密钥)
- 请求:`{ kind, actorId, payload, note?, status? }`
- 成功:`{ status: "ok", credential }`
@ -287,99 +282,129 @@ pnpm openclaw qa credentials remove --credential-id <credential-id>
- 请求:`{ kind?, status?, includePayload?, limit? }`
- 成功:`{ status: "ok", credentials, count }`
Telegram 类型的载荷形状
Telegram 类型的载荷结构
- `{ groupId: string, driverToken: string, sutToken: string }`
- `groupId` 必须是数字形式的 Telegram 聊天 ID 字符串。
- `admin/add` 会对 `kind: "telegram"` 校验此形状,并拒绝格式错误的载荷。
- `admin/add` 会对 `kind: "telegram"` 校验此结构,并拒绝格式错误的载荷。
### 向 QA 添加渠道
新渠道适配器的架构和场景辅助函数名称位于 [QA overview → 添加渠道](/zh-CN/concepts/qa-e2e-automation#adding-a-channel)。最低要求:在共享 `qa-lab` 主机接缝上实现传输运行器,在插件清单中声明 `qaRunners`,挂载为 `openclaw qa <runner>`,并在 `qa/scenarios/` 下编写场景。
新渠道适配器的架构和场景辅助名称位于 [QA overview → 添加渠道](/zh-CN/concepts/qa-e2e-automation#adding-a-channel)。最低要求:在共享 `qa-lab` 主机 seam 上实现传输 runner,在插件清单中声明 `qaRunners`,挂载为 `openclaw qa <runner>`,并在 `qa/scenarios/` 下编写场景。
## 测试套件(哪里运行什么)
## 测试套件(哪里运行什么)
可以把这些套件理解为“真实度逐步提高”(同时脆弱性/成本也逐步提高
可以把这些套件理解为“真实性递增”(同时不稳定性/成本也递增
### 单元 / 集成(默认)
- 命令:`pnpm test`
- 配置:未定向运行使用 `vitest.full-*.config.ts` 分片集合,并且可能会将多项目分片展开为按项目划分的配置,以便并行调度
- 配置:未定向运行使用 `vitest.full-*.config.ts` 分片集合,并且可能会把多项目分片展开为按项目的配置以便并行调度
- 文件:`src/**/*.test.ts`、`packages/**/*.test.ts` 和 `test/**/*.test.ts` 下的核心/单元清单UI 单元测试在专用 `unit-ui` 分片中运行
- 范围:
- 纯单元测试
- 进程内集成测试Gateway 网关认证、路由、工具、解析、配置)
- 已知 bug 的确定性回归测试
- 期:
- 期
- 在 CI 中运行
- 不需要真实密钥
- 应该快速且稳定
- 解析器和公共表面加载器测试必须使用生成的微型插件夹具来证明宽泛的 `api.js`
- 解析器和公开表面加载器测试必须使用生成的微型插件 fixture 来证明宽泛 `api.js`
`runtime-api.js` 回退行为,而不是使用真实内置插件源 API。真实插件 API 加载应放在
插件自有的契约/集成套件中。
<AccordionGroup>
<Accordion title="项目、分片和范围化通道">
<Accordion title="项目、分片和作用域化 lane">
- 未定向的 `pnpm test` 会运行十二个更小的分片配置(`core-unit-fast`、`core-unit-src`、`core-unit-security`、`core-unit-ui`、`core-unit-support`、`core-support-boundary`、`core-contracts`、`core-bundled`、`core-runtime`、`agentic`、`auto-reply`、`extensions`),而不是一个巨大的原生根项目进程。这会降低高负载机器上的峰值 RSS并避免 auto-reply/插件工作让无关套件资源不足
- `pnpm test --watch` 仍使用原生根 `vitest.config.ts` 项目图,因为多分片 watch 循环并不实
- `pnpm test`、`pnpm test:watch` 和 `pnpm test:perf:imports` 会先通过范围化通道路由显式文件/目录目标,因此 `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` 可避免支付完整根项目启动成本。
- `pnpm test:changed` 默认会把已变更的 git 路径展开为廉价的范围化通道:直接测试编辑、同级 `*.test.ts` 文件、显式源映射和本地导入图依赖项。配置/设置/包编辑不会广泛运行测试,除非你显式使用 `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`
- `pnpm check:changed` 是窄范围工作的常规智能本地检查门禁。它会把差异分类为核心、核心测试、插件、插件测试、应用、文档、发布元数据、实时 Docker 工具和工具链,然后运行匹配的类型检查、lint 和保护命令。它不会运行 Vitest 测试;要获得测试证明,请调用 `pnpm test:changed` 或显式 `pnpm test <target>`。仅发布元数据的版本升级会运行定向版本/配置/根依赖检查,并带有一个保护,用于拒绝顶层版本字段之外的包变更
- 实时 Docker ACP harness 编辑会运行聚焦检查:实时 Docker 认证脚本的 shell 语法,以及实时 Docker 调度器 dry-run。只有当差异限定在 `scripts["test:docker:live-*"]` 时才包含 `package.json` 更;依赖、导出、版本和其他包表面编辑仍使用更广泛的保护
- 来自 agents、commands、plugins、auto-reply 辅助函数、`plugin-sdk` 和类似纯工具区域的轻导入单元测试会通过 `unit-fast` 通道,该通道跳过 `test/setup-openclaw-runtime.ts`;有状态/运行时较重的文件仍保留在现有通道上。
- 选定的 `plugin-sdk``commands` 辅助源文件也会在 changed 模式运行时映射到这些轻量通道中的显式同级测试,因此辅助函数编辑无需重新运行该目录的完整重型套件。
- `auto-reply` 为顶层核心辅助函数、顶层 `reply.*` 集成测试和 `src/auto-reply/reply/**` 子树提供了专用分组。CI 还会将 reply 子树进一步拆分为 agent-runner、dispatch 和 commands/state-routing 分片,避免某个导入繁重的分组独占完整 Node 尾部时间
- 普通 PR/main CI 会有意跳过插件批量扫测和仅发布使用的 `agentic-plugins` 分片。完整发布验证会为发布候选触发单独的 `Plugin Prerelease` 子工作流,用于这些插件/插件密集型套件。
- 未定向的 `pnpm test` 会运行十二个更小的分片配置(`core-unit-fast`、`core-unit-src`、`core-unit-security`、`core-unit-ui`、`core-unit-support`、`core-support-boundary`、`core-contracts`、`core-bundled`、`core-runtime`、`agentic`、`auto-reply`、`extensions`),而不是一个巨大的原生根项目进程。这样可以降低负载机器上的峰值 RSS并避免 auto-reply/扩展工作饿死无关套件
- `pnpm test --watch`使用原生根 `vitest.config.ts` 项目图,因为多分片 watch 循环并不实
- `pnpm test`、`pnpm test:watch` 和 `pnpm test:perf:imports` 会先通过作用域化 lane 路由显式文件/目录目标,因此 `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts`避免支付完整根项目启动成本。
- `pnpm test:changed` 默认会把已更改的 git 路径展开为廉价的作用域化 lane:直接测试编辑、同级 `*.test.ts` 文件、显式源映射和本地导入图依赖项。配置/设置/包编辑不会进行宽泛测试运行,除非你显式使用 `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`
- `pnpm check:changed` 是窄范围工作的常规智能本地检查 gate。它会把 diff 分类为核心、核心测试、扩展、扩展测试、应用、文档、发布元数据、实时 Docker 工具和工具链,然后运行匹配的 typecheck、lint 和 guard 命令。它不会运行 Vitest 测试;如需测试证明,请调用 `pnpm test:changed` 或显式 `pnpm test <target>`。仅发布元数据的版本 bump 会运行定向版本/配置/根依赖检查,并带有一个 guard用于拒绝顶层版本字段之外的包更改
- 实时 Docker ACP harness 编辑会运行聚焦检查:实时 Docker auth 脚本的 shell 语法和实时 Docker 调度器 dry-run。仅当 diff 限定在 `scripts["test:docker:live-*"]` 时才包含 `package.json`;依赖、导出、版本和其他包表面编辑仍使用更宽泛的 guard
- 来自 agents、commands、plugins、auto-reply 辅助器、`plugin-sdk` 和类似纯工具区域的轻导入单元测试会路由到 `unit-fast` lane该 lane 会跳过 `test/setup-openclaw-runtime.ts`;有状态/运行时较重的文件仍留在现有 lane 上。
- 选定的 `plugin-sdk``commands` 辅助源文件也会在 changed 模式运行中映射到这些轻量 lane 中的显式同级测试,因此辅助器编辑可以避免重新运行该目录的完整重型套件。
- `auto-reply` 为顶层核心辅助器、顶层 `reply.*` 集成测试和 `src/auto-reply/reply/**` 子树提供专用 bucket。CI 进一步把 reply 子树拆分为 agent-runner、dispatch 和 commands/state-routing 分片,避免某个导入很重的 bucket 独占完整 Node 尾部
- 常规 PR/main CI 会有意跳过扩展批量扫测和仅发布使用的 `agentic-plugins` 分片。完整发布验证会针对发布候选触发单独的 `Plugin Prerelease` 子工作流,用于这些插件/扩展较重的套件。
</Accordion>
<Accordion title="嵌入式运行器覆盖">
<Accordion title="嵌入式 runner 覆盖范围">
- 当你更改消息工具发现输入或压缩运行时上下文时,请保留两层覆盖。
- 为纯路由和规范化边界添加聚焦的辅助函数回归测试。
- 保持嵌入式运行器集成套件健康:
- 当你更改 message-tool 设备发现输入或 compaction 运行时
上下文时,请保持两个层级的覆盖。
- 为纯路由和规范化边界添加聚焦辅助器回归测试。
- 保持嵌入式 runner 集成套件健康:
`src/agents/pi-embedded-runner/compact.hooks.test.ts`
`src/agents/pi-embedded-runner/run.overflow-compaction.test.ts`
`src/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts`
- 这些套件会验证范围化 ID 和压缩行为仍通过真实的 `run.ts` / `compact.ts` 路径流动;仅辅助函数测试并不足以替代这些集成路径。
- 这些套件会验证作用域化 ID 和 compaction 行为仍然通过真实
`run.ts` / `compact.ts` 路径流动;仅辅助器测试
不能充分替代这些集成路径。
</Accordion>
<Accordion title="Vitest 和隔离默认值">
<Accordion title="Vitest pool 和隔离默认值">
- 基础 Vitest 配置默认使用 `threads`
- 共享 Vitest 配置固定 `isolate: false`并在根项目、e2e 和实时配置中使用非隔离运行器。
- 根 UI 通道保留其 `jsdom` 设置和优化器,但也运行在共享的非隔离运行器上。
- 每个 `pnpm test` 分片都从共享 Vitest 配置继承相同的 `threads` + `isolate: false` 默认值。
- `scripts/run-vitest.mjs` 默认会为 Vitest 子 Node 进程添加 `--no-maglev`,以降低大型本地运行期间的 V8 编译抖动。设置 `OPENCLAW_VITEST_ENABLE_MAGLEV=1` 可与原版 V8 行为比较。
- 共享 Vitest 配置固定 `isolate: false`并在根项目、e2e 和实时配置中使用
非隔离 runner。
- 根 UI lane 保留其 `jsdom` 设置和优化器,但也运行在
共享非隔离 runner 上。
- 每个 `pnpm test` 分片都会从共享 Vitest 配置继承相同的 `threads` + `isolate: false`
默认值。
- `scripts/run-vitest.mjs` 默认会为 Vitest 子 Node
进程添加 `--no-maglev`,以减少大型本地运行期间的 V8 编译抖动。
设置 `OPENCLAW_VITEST_ENABLE_MAGLEV=1` 可与原生 V8
行为对比。
</Accordion>
<Accordion title="快速本地迭代">
- `pnpm changed:lanes` 会显示某个差异触发哪些架构通道。
- pre-commit 钩子只做格式化。它会重新暂存已格式化的文件,不会运行 lint、类型检查或测试。
- 当你需要智能本地检查门禁时,请在交接或推送前显式运行 `pnpm check:changed`
- `pnpm test:changed` 默认会通过廉价的范围化通道路由。仅当智能体判断某个 harness、配置、包或契约编辑确实需要更广泛的 Vitest 覆盖时,才使用 `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`
- `pnpm test:max``pnpm test:changed:max` 保持相同的路由行为,只是 worker 上限更高。
- 本地 worker 自动扩缩容有意保持保守,并会在主机平均负载已经很高时退避,因此多个并发 Vitest 运行默认会造成更少损害。
- 基础 Vitest 配置将项目/配置文件标记为 `forceRerunTriggers`,因此测试接线变化时 changed 模式重新运行仍保持正确。
- 配置会在受支持主机上保持启用 `OPENCLAW_VITEST_FS_MODULE_CACHE`;如果你希望为直接性能分析使用一个显式缓存位置,请设置 `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path`
- `pnpm changed:lanes` 显示 diff 会触发哪些架构 lane。
- pre-commit hook 仅处理格式化。它会重新暂存格式化后的文件,
不会运行 lint、typecheck 或测试。
- 当你需要智能本地检查 gate 时,请在交接或 push 前显式运行 `pnpm check:changed`
- `pnpm test:changed` 默认通过廉价的作用域化 lane 路由。仅当智能体
判断 harness、配置、包或契约编辑确实需要更宽泛的
Vitest 覆盖时,才使用 `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`
- `pnpm test:max``pnpm test:changed:max` 保持相同的路由
行为,只是 worker 上限更高。
- 本地 worker 自动缩放刻意保持保守,并会在主机平均负载已经很高时
回退,因此默认情况下多个并发
Vitest 运行造成的影响更小。
- 基础 Vitest 配置把项目/配置文件标记为
`forceRerunTriggers`,因此当测试
接线变化时changed 模式重新运行仍保持正确。
- 配置会在受支持的
主机上保持启用 `OPENCLAW_VITEST_FS_MODULE_CACHE`;如果你希望为直接性能分析使用
一个显式缓存位置,请设置 `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path`
</Accordion>
<Accordion title="性能调试">
- `pnpm test:perf:imports` 会启用 Vitest 导入耗时报告以及导入分解输出。
- `pnpm test:perf:imports:changed` 会将同一性能分析视图限定到自 `origin/main` 以来变更的文件。
- `pnpm test:perf:imports` 启用 Vitest 导入耗时报告以及
导入拆分输出。
- `pnpm test:perf:imports:changed` 将同一个性能分析视图限定到
`origin/main` 以来更改的文件。
- 分片计时数据会写入 `.artifacts/vitest-shard-timings.json`
整配置运行使用配置路径作为键include-pattern CI 分片会追加分片名称,以便单独跟踪过滤后的分片。
- 当某个热点测试仍把大部分时间花在启动导入上时,请把重型依赖放在窄本地 `*.runtime.ts` 接缝后面,并直接 mock 该接缝,而不是深度导入运行时辅助函数只为把它们传给 `vi.mock(...)`
- `pnpm test:perf:changed:bench -- --ref <git-ref>` 会比较已提交差异对应的已路由 `test:changed` 与原生根项目路径,并打印墙钟时间和 macOS 最大 RSS。
- `pnpm test:perf:changed:bench -- --worktree` 会通过 `scripts/test-projects.mjs` 和根 Vitest 配置路由已变更文件列表,从而对当前脏工作树做基准测试。
- `pnpm test:perf:profile:main` 会为 Vitest/Vite 启动和转换开销写入主线程 CPU profile。
- `pnpm test:perf:profile:runner` 会在禁用文件并行的情况下,为单元套件写入运行器 CPU+堆 profile。
整配置运行使用配置路径作为键include-pattern CI
分片会追加分片名称,以便单独跟踪过滤后的分片。
- 当某个热点测试仍然把大部分时间花在启动导入上时,
请把重型依赖放到窄范围本地 `*.runtime.ts` seam 之后,并
直接 mock 该 seam而不是仅为了通过 `vi.mock(...)`
传递而深度导入运行时辅助器。
- `pnpm test:perf:changed:bench -- --ref <git-ref>` 会将路由后的
`test:changed` 与该已提交 diff 的原生根项目路径比较,并打印墙钟时间和 macOS 最大 RSS。
- `pnpm test:perf:changed:bench -- --worktree` 会通过把已更改文件列表路由进
`scripts/test-projects.mjs` 和根 Vitest 配置来基准测试当前
脏工作树。
- `pnpm test:perf:profile:main` 会为
Vitest/Vite 启动和转换开销写入主线程 CPU profile。
- `pnpm test:perf:profile:runner` 会在禁用文件并行度的情况下,为
单元套件写入 runner CPU+heap profile。
</Accordion>
</AccordionGroup>
@ -387,16 +412,16 @@ Telegram 类型的载荷形状:
### 稳定性Gateway 网关)
- 命令:`pnpm test:stability:gateway`
- 配置:`vitest.gateway.config.ts`,强制使用一个 worker
- 配置:`vitest.gateway.config.ts`,强制一个 worker
- 范围:
- 启动一个真实的 loopback Gateway 网关,默认启用诊断
- 通过诊断事件路径驱动合成的 Gateway 网关消息、记忆和大载荷抖动
- 启动一个真实的 loopback Gateway 网关,默认启用 diagnostics
- 通过诊断事件路径驱动合成的 gateway 消息、记忆和大载荷 churn
- 通过 Gateway 网关 WS RPC 查询 `diagnostics.stability`
- 覆盖诊断稳定性包持久化辅助函数
- 断言记录器保持有界、合成 RSS 样本保持在压力预算以内,并且每个会话的队列深度都会排空回
- 期:
- 覆盖诊断稳定性 bundle 持久化辅助器
- 断言 recorder 保持有界、合成 RSS 样本低于压力预算,并且每会话队列深度回落到
- 期
- CI 安全且无需密钥
- 用于稳定性回归跟进的窄通道,而不是完整 Gateway 网关套件的替代品
- 用于稳定性回归跟进的窄 lane不是完整 Gateway 网关套件的替代品
### E2EGateway 网关冒烟)
@ -404,17 +429,17 @@ Telegram 类型的载荷形状:
- 配置:`vitest.e2e.config.ts`
- 文件:`src/**/*.e2e.test.ts`、`test/**/*.e2e.test.ts`,以及 `extensions/` 下的内置插件 E2E 测试
- 运行时默认值:
- 使用 Vitest `threads` `isolate: false`,与仓库其余部分一致。
- 使用自适应 workerCI最多 2 个本地:默认 1 个)。
- 默认以静默模式运行,以减少控制台 I/O 开销。
- 有用的覆盖项:
- `OPENCLAW_E2E_WORKERS=<n>` 用于强制 worker 数量(上限 16
- `OPENCLAW_E2E_VERBOSE=1` 用于重新启用详细控制台输出。
- 使用 Vitest `threads`,并设置 `isolate: false`,与仓库其余部分一致。
- 使用自适应 workerCI最多 2 个本地:默认 1 个)。
- 默认以 silent 模式运行,以减少控制台 I/O 开销。
- 常用覆盖项:
- `OPENCLAW_E2E_WORKERS=<n>` 强制 worker 数量(上限 16
- `OPENCLAW_E2E_VERBOSE=1` 重新启用详细控制台输出。
- 范围:
- 多实例 Gateway 网关端到端行为
- WebSocket/HTTP 表面、节点配对和更重的网络
- 期:
- 在 CI 中运行(当流水线启用时)
- 多实例 gateway 端到端行为
- WebSocket/HTTP 表面、节点配对和更重的网络行为
- 期
- 在 CI 中运行(当流水线启用时)
- 不需要真实密钥
- 比单元测试有更多移动部件(可能更慢)
@ -423,39 +448,39 @@ Telegram 类型的载荷形状:
- 命令:`pnpm test:e2e:openshell`
- 文件:`extensions/openshell/src/backend.e2e.test.ts`
- 范围:
- 通过 Docker 在主机上启动一个隔离的 OpenShell Gateway 网关
- 通过 Docker 在宿主机上启动隔离的 OpenShell Gateway 网关
- 从临时本地 Dockerfile 创建一个沙箱
- 通过真实的 `sandbox ssh-config` + SSH exec 测试 OpenClaw 的 OpenShell 后端
- 通过沙箱 fs 桥接验证远程规范文件系统行为
- 通过沙箱 fs bridge 验证远程规范化文件系统行为
- 预期:
- 仅按需启用;不属于默认 `pnpm test:e2e` 运行的一部分
- 需要本地 `openshell` CLI 和可用的 Docker 守护进程
- 仅限选择启用;不属于默认 `pnpm test:e2e` 运行的一部分
- 需要本地 `openshell` CLI 以及可工作的 Docker daemon
- 使用隔离的 `HOME` / `XDG_CONFIG_HOME`,然后销毁测试 Gateway 网关和沙箱
- 有用的覆盖项:
- `OPENCLAW_E2E_OPENSHELL=1` 用于在手动运行更广的 e2e 套件时启用该测试
- `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` 用于指向非默认 CLI 二进制文件或包装脚本
- `OPENCLAW_E2E_OPENSHELL=1` 用于在手动运行更广的 e2e 套件时启用该测试
- `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` 用于指向非默认 CLI 二进制文件或包装脚本
### 实时(真实提供商 + 真实模型)
- 命令:`pnpm test:live`
- 配置:`vitest.live.config.ts`
- 文件:`src/**/*.live.test.ts`、`test/**/*.live.test.ts`,以及 `extensions/` 下的内置插件实时测试
- 默认:通过 `pnpm test:live` **启用**(设置 `OPENCLAW_LIVE_TEST=1`
- 默认: `pnpm test:live` **启用**(设置 `OPENCLAW_LIVE_TEST=1`
- 范围:
- “这个提供商/模型在_今天_使用真实凭证时是否真的可用?”
- 捕获提供商格式变化、工具调用细节、认证问题和速率限制行为
- “这个提供商/模型在 _今天_ 使用真实凭证时是否实际可用?”
- 捕获提供商格式变化、工具调用差异、身份验证问题和速率限制行为
- 预期:
- 设计上不保证 CI 稳定(真实网络、真实提供商策略、配额、故障)
- 会产生费用 / 使用速率限制额度
- 优先运行缩小后的子集,而不是“所有内容
- 实时运行会 source `~/.profile` 以获取缺失的 API key。
- 默认情况下,实时运行仍会隔离 `HOME`,并将配置/认证材料复制到临时测试主目录中,这样单元夹具就无法修改你真实的 `~/.openclaw`
- 按设计并不保证 CI 稳定(真实网络、真实提供商策略、配额、故障)
- 会花钱 / 使用速率限制
- 优先运行缩小范围的子集,而不是“全部
- 实时运行会加载 `~/.profile` 以获取缺失的 API key。
- 默认情况下,实时运行仍会隔离 `HOME`,并将配置/身份验证材料复制到临时测试 home 中,以免单元测试夹具修改你真实的 `~/.openclaw`
- 只有在你有意需要实时测试使用真实主目录时,才设置 `OPENCLAW_LIVE_USE_REAL_HOME=1`
- `pnpm test:live` 现在默认使用更安静的模式:它保留 `[live] ...` 进度输出,但抑制额外的 `~/.profile` 提示,并静默 Gateway 网关启动日志/Bonjour 噪声。如果你想恢复完整启动日志,请设置 `OPENCLAW_LIVE_TEST_QUIET=0`
- API key 轮换(按提供商区分):设置带逗号/分号格式的 `*_API_KEYS`,或 `*_API_KEY_1`、`*_API_KEY_2`(例如 `OPENAI_API_KEYS`、`ANTHROPIC_API_KEYS`、`GEMINI_API_KEYS`),也可以通过 `OPENCLAW_LIVE_*_KEY` 单次实时覆盖;测试会在收到速率限制响应时重试。
- `pnpm test:live` 现在默认使用更安静的模式:它保留 `[live] ...` 进度输出,但抑制额外的 `~/.profile` 提示,并静音 Gateway 网关引导日志/Bonjour chatter。如果你想恢复完整启动日志,请设置 `OPENCLAW_LIVE_TEST_QUIET=0`
- API key 轮换(按提供商):使用逗号/分号格式设置 `*_API_KEYS`,或设置 `*_API_KEY_1`、`*_API_KEY_2`(例如 `OPENAI_API_KEYS`、`ANTHROPIC_API_KEYS`、`GEMINI_API_KEYS`),也可以通过 `OPENCLAW_LIVE_*_KEY` 设置单次实时覆盖;测试会在收到速率限制响应时重试。
- 进度/Heartbeat 输出:
- 实时套件现在会向 stderr 发出进度行,因此即使 Vitest 控制台捕获很安静,长时间的提供商调用也能明显看到仍在活动。
- `vitest.live.config.ts` 禁用 Vitest 控制台拦截,因此提供商/Gateway 网关进度行会在实时运行期间立即流式输出。
- 实时套件现在会向 stderr 发出进度行,因此即使 Vitest 控制台捕获很安静,长时间的提供商调用也能看出仍在活动。
- `vitest.live.config.ts` 禁用 Vitest 控制台拦截,因此在实时运行期间,提供商/Gateway 网关进度行会立即流式输出。
- 使用 `OPENCLAW_LIVE_HEARTBEAT_MS` 调整直接模型 Heartbeat。
- 使用 `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS` 调整 Gateway 网关/探测 Heartbeat。
@ -463,137 +488,173 @@ Telegram 类型的载荷形状:
使用此决策表:
- 编辑逻辑/测试:运行 `pnpm test`(如果改动很多,也运行 `pnpm test:coverage`
- 触及 Gateway 网关网络 / WS 协议 / 配对:添加 `pnpm test:e2e`
- 调试“我的机器人宕机了” / 提供商特定故障 / 工具调用:运行缩小后`pnpm test:live`
- 编辑逻辑/测试:运行 `pnpm test`(如果改动较多,再运行 `pnpm test:coverage`
- 触及 Gateway 网关网络 / WS 协议 / 配对:再加上 `pnpm test:e2e`
- 调试“我的 bot 掉线了”/提供商特定失败/工具调用:运行缩小范围`pnpm test:live`
## 实时(触网)测试
## 实时(触)测试
关于实时模型矩阵、CLI 后端冒烟、ACP 冒烟、Codex 应用服务器
harness以及所有媒体提供商实时测试Deepgram、BytePlus、ComfyUI、图像
音乐、视频、媒体 harness再加上实时运行的凭证处理请参阅
[实时套件测试](/zh-CN/help/testing-live)。关于专的更新和
关于实时模型矩阵、CLI 后端冒烟测试、ACP 冒烟测试、Codex app-server
harness以及所有媒体提供商实时测试Deepgram、BytePlus、ComfyUI、image
music、video、media harness——再加上实时运行的凭证处理——请参阅
[测试实时套件](/zh-CN/help/testing-live)。关于专的更新和
插件验证清单,请参阅
[更新和插件测试](/zh-CN/help/testing-updates-plugins)。
## Docker 运行器(可选的“在 Linux 中工作”检查)
## Docker 运行器(可选的“在 Linux 中可用”检查)
这些 Docker 运行器分为两类:
- 实时模型运行器:`test:docker:live-models` 和 `test:docker:live-gateway` 只会在仓库 Docker 镜像内运行与其匹配的 profile-key 实时文件(`src/agents/models.profiles.live.test.ts` 和 `src/gateway/gateway-models.profiles.live.test.ts`挂载你的本地配置目录和工作区(如果已挂载,也会 source `~/.profile`)。匹配的本地入口点是 `test:live:models-profiles``test:live:gateway-profiles`
- Docker 实时运行器默认使用较小的冒烟上限,让完整 Docker 扫描保持实用
- 实时模型运行器:`test:docker:live-models` 和 `test:docker:live-gateway` 只会在仓库 Docker 镜像中运行各自匹配的 profile-key 实时文件(`src/agents/models.profiles.live.test.ts` 和 `src/gateway/gateway-models.profiles.live.test.ts`),挂载你的本地配置目录和工作区(如果已挂载,也会加载 `~/.profile`)。匹配的本地入口点是 `test:live:models-profiles``test:live:gateway-profiles`
- Docker 实时运行器默认使用较小的冒烟上限,以便完整 Docker 扫描保持可操作
`test:docker:live-models` 默认使用 `OPENCLAW_LIVE_MAX_MODELS=12`,并且
`test:docker:live-gateway` 默认使用 `OPENCLAW_LIVE_GATEWAY_SMOKE=1`
`OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8`
`OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000`
`OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`。只有在你明确要更大的穷尽扫描时,才覆盖这些环境变量。
- `test:docker:all` 通过 `test:docker:live-build` 构建一次实时 Docker 镜像,通过 `scripts/package-openclaw-for-docker.mjs` 将 OpenClaw 打包一次为 npm tarball然后构建/复用两个 `scripts/e2e/Dockerfile` 镜像。裸镜像只是用于安装/更新/插件依赖通道的 Node/Git 运行器;这些通道会挂载预构建 tarball。功能镜像会将同一个 tarball 安装到 `/app`用于已构建应用的功能通道。Docker 通道定义位于 `scripts/lib/docker-e2e-scenarios.mjs`;规划器逻辑位于 `scripts/lib/docker-e2e-plan.mjs``scripts/test-docker-all.mjs` 执行选计划。聚合运行使用加权本地调度器:`OPENCLAW_DOCKER_ALL_PARALLELISM` 控制进程槽位,而资源上限会避免重型实时、npm-install 和多服务通道同时全部启动。如果单个通道比当前上限更重,调度器仍可在池为空时启动它,然后让它单独运行,直到再次有容量可用。默认值为 10 个槽位、`OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9`、`OPENCLAW_DOCKER_ALL_NPM_LIMIT=10` 和 `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7`;只有在 Docker 主机有更多余量时,才调整 `OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT``OPENCLAW_DOCKER_ALL_DOCKER_LIMIT`。运行器默认执行 Docker 预检,移除陈旧的 OpenClaw E2E 容器,每 30 秒打印一次状态,将成功通道耗时存储在 `.artifacts/docker-tests/lane-timings.json`,并在后续运行中使用这些耗时优先启动更长的通道。使用 `OPENCLAW_DOCKER_ALL_DRY_RUN=1` 可在不构建或运行 Docker 的情况下打印加权通道清单,或者使用 `node scripts/test-docker-all.mjs --plan-json` 打印所选通道、包/镜像需求和凭证的 CI 计划。
- `Package Acceptance` 是 GitHub 原生的包门禁,用于验证“这个可安装 tarball 是否作为产品可用?”它会从 `source=npm`、`source=ref`、`source=url` 或 `source=artifact` 解析一个候选,将其上传为 `package-under-test`,然后针对这个精确 tarball 运行可复用的 Docker E2E 通道,而不是重新打包所选 ref。Profile 按覆盖广度排序:`smoke`、`package`、`product` 和 `full`。关于包/更新/插件契约、已发布升级幸存矩阵、发布默认值和失败分诊,请参阅[更新和插件测试](/zh-CN/help/testing-updates-plugins)。
- 构建和发布检查会在 tsdown 之后运行 `scripts/check-cli-bootstrap-imports.mjs`。该防护会从 `dist/entry.js``dist/cli/run-main.js` 遍历静态构建图,如果命令分发前的启动导入了 Commander、提示 UI、undici 或日志等包依赖,就会失败;它还会确保打包的 Gateway 网关运行 chunk 保持在预算内,并拒绝已知冷 Gateway 网关路径的静态导入。打包后的 CLI 冒烟还覆盖根帮助、新手引导帮助、Doctor 帮助、Status、配置 schema 和模型列表命令。
- Package Acceptance 旧版兼容性上限为 `2026.4.25`(包`2026.4.25-beta.*`。在该截止点之前harness 仅容忍已发布包的元数据缺口:省略的私有 QA 清单条目、缺失的 `gateway install --wrapper`、tarball 派生 git 夹具中缺失的补丁文件、缺失的持久化 `update.channel`、旧版插件安装记录位置、缺失的 marketplace 安装记录持久化,以及 `plugins update` 期间的配置元数据迁移。对于 `2026.4.25` 之后的包,这些路径都是严格失败。
- 容器冒烟运行器:`test:docker:openwebui`、`test:docker:onboard`、`test:docker:npm-onboard-channel-agent`、`test:docker:update-channel-switch`、`test:docker:upgrade-survivor`、`test:docker:published-upgrade-survivor`、`test:docker:session-runtime-context`、`test:docker:agents-delete-shared-workspace`、`test:docker:gateway-network`、`test:docker:browser-cdp-snapshot`、`test:docker:mcp-channels`、`test:docker:pi-bundle-mcp-tools`、`test:docker:cron-mcp-cleanup`、`test:docker:plugins`、`test:docker:plugin-update` 和 `test:docker:config-reload` 会启动一个或多个真实容器,并验证更高层级的集成路径。
`OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`。只有在你明确要更大的穷尽扫描时,才覆盖这些环境变量。
- `test:docker:all` 会先通过 `test:docker:live-build` 构建一次实时 Docker 镜像,通过 `scripts/package-openclaw-for-docker.mjs` 将 OpenClaw 打包一次为 npm tarball然后构建/复用两个 `scripts/e2e/Dockerfile` 镜像。bare 镜像只是用于 install/update/plugin-dependency lane 的 Node/Git 运行器;这些 lane 会挂载预构建的 tarball。functional 镜像会将同一个 tarball 安装到 `/app`,用于 built-app functionality lane。Docker lane 定义位于 `scripts/lib/docker-e2e-scenarios.mjs`;规划器逻辑位于 `scripts/lib/docker-e2e-plan.mjs``scripts/test-docker-all.mjs` 执行选计划。聚合运行使用加权本地调度器:`OPENCLAW_DOCKER_ALL_PARALLELISM` 控制进程槽位,而资源上限会避免繁重的实时、npm-install 和 multi-service lane 同时全部启动。如果单个 lane 比当前上限更重,调度器仍可在池为空时启动它,并让它单独运行,直到容量再次可用。默认值为 10 个槽位、`OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9`、`OPENCLAW_DOCKER_ALL_NPM_LIMIT=10` 和 `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7`;只有在 Docker 宿主机有更多余量时,才调整 `OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT``OPENCLAW_DOCKER_ALL_DOCKER_LIMIT`。运行器默认执行 Docker 预检,移除陈旧的 OpenClaw E2E 容器,每 30 秒打印状态,将成功 lane 的耗时存储在 `.artifacts/docker-tests/lane-timings.json`,并在后续运行中使用这些耗时优先启动更长的 lane。使用 `OPENCLAW_DOCKER_ALL_DRY_RUN=1` 可在不构建或运行 Docker 的情况下打印加权 lane 清单,或使用 `node scripts/test-docker-all.mjs --plan-json` 打印所选 lane、package/image 需求和凭证的 CI 计划。
- `Package Acceptance` 是 GitHub 原生的 package gate用于验证“这个可安装 tarball 作为产品是否可用?”它会从 `source=npm`、`source=ref`、`source=url` 或 `source=artifact` 解析一个候选 package,将其上传为 `package-under-test`,然后针对这个精确 tarball 运行可复用的 Docker E2E lane,而不是重新打包所选 ref。Profile 按覆盖广度排序:`smoke`、`package`、`product` 和 `full`。关于 package/update/plugin 合约、已发布升级存活矩阵、发布默认值和失败分诊,请参阅[更新和插件测试](/zh-CN/help/testing-updates-plugins)。
- 构建和发布检查会在 tsdown 之后运行 `scripts/check-cli-bootstrap-imports.mjs`。该守卫会从 `dist/entry.js``dist/cli/run-main.js` 遍历静态构建图,如果命令分发前的启动导入了 Commander、prompt UI、undici 或 logging 等 package 依赖,就会失败;它还会让内置 Gateway 网关运行 chunk 保持在预算内,并拒绝已知冷 Gateway 网关路径的静态导入。打包后的 CLI 冒烟测试还覆盖 root help、onboard help、doctor help、status、config schema 和 model-list 命令。
- Package Acceptance 旧版兼容性上限为 `2026.4.25`(包`2026.4.25-beta.*`。在该截止点之前harness 只容忍已发布 package 的元数据缺口:省略的私有 QA inventory 条目、缺失的 `gateway install --wrapper`、tarball 派生 git 夹具中缺失的 patch 文件、缺失的持久化 `update.channel`、旧版插件 install-record 位置、缺失的 marketplace install-record 持久化,以及 `plugins update` 期间的 config 元数据迁移。对于 `2026.4.25` 之后的 package,这些路径都是严格失败。
- 容器冒烟运行器:`test:docker:openwebui`、`test:docker:onboard`、`test:docker:npm-onboard-channel-agent`、`test:docker:update-channel-switch`、`test:docker:upgrade-survivor`、`test:docker:published-upgrade-survivor`、`test:docker:session-runtime-context`、`test:docker:agents-delete-shared-workspace`、`test:docker:gateway-network`、`test:docker:browser-cdp-snapshot`、`test:docker:mcp-channels`、`test:docker:pi-bundle-mcp-tools`、`test:docker:cron-mcp-cleanup`、`test:docker:plugins`、`test:docker:plugin-update`、`test:docker:plugin-lifecycle-matrix``test:docker:config-reload` 会启动一个或多个真实容器,并验证更高层级的集成路径。
实时模型 Docker 运行器还只会绑定挂载所需的 CLI 认证主目录(或者在运行未缩小时挂载所有支持的主目录),然后在运行前将它们复制到容器主目录中,这样外部 CLI OAuth 就可以刷新令牌,而不会修改主机认证存储:
实时模型 Docker 运行器还只会 bind-mount 所需的 CLI auth home如果运行未缩小范围则挂载所有受支持的 auth home然后在运行前将它们复制到容器 home 中,以便外部 CLI OAuth 可以刷新令牌,而不会修改宿主机 auth 存储:
- 直接模型:`pnpm test:docker:live-models`(脚本:`scripts/test-live-models-docker.sh`
- ACP 绑定冒烟测试:`pnpm test:docker:live-acp-bind`(脚本:`scripts/test-live-acp-bind-docker.sh`;默认覆盖 Claude、Codex 和 Gemini并通过 `pnpm test:docker:live-acp-bind:droid` `pnpm test:docker:live-acp-bind:opencode` 严格覆盖 Droid/OpenCode
- ACP 绑定冒烟测试:`pnpm test:docker:live-acp-bind`(脚本:`scripts/test-live-acp-bind-docker.sh`;默认覆盖 Claude、Codex 和 Gemini并通过 `pnpm test:docker:live-acp-bind:droid` `pnpm test:docker:live-acp-bind:opencode` 严格覆盖 Droid/OpenCode
- CLI 后端冒烟测试:`pnpm test:docker:live-cli-backend`(脚本:`scripts/test-live-cli-backend-docker.sh`
- Codex app-server harness 冒烟测试:`pnpm test:docker:live-codex-harness`(脚本:`scripts/test-live-codex-harness-docker.sh`
- Gateway 网关 + 开发智能体:`pnpm test:docker:live-gateway`(脚本:`scripts/test-live-gateway-models-docker.sh`
- 可观测性冒烟测试:`pnpm qa:otel:smoke` 是一个私有 QA 源码检出通道。它有意不属于 package Docker 发布通道,因为 npm tarball 省略了 QA Lab。
- Open WebUI 在线冒烟测试:`pnpm test:docker:openwebui`(脚本:`scripts/e2e/openwebui-docker.sh`
- 可观测性冒烟测试:`pnpm qa:otel:smoke` 是私有 QA 源码检出通道。它有意不包含在包 Docker 发布通道中,因为 npm tarball 会省略 QA Lab。
- Open WebUI 实时冒烟测试:`pnpm test:docker:openwebui`(脚本:`scripts/e2e/openwebui-docker.sh`
- 新手引导向导TTY完整脚手架`pnpm test:docker:onboard`(脚本:`scripts/e2e/onboard-docker.sh`
- Npm tarball 新手引导/渠道/智能体冒烟测试:`pnpm test:docker:npm-onboard-channel-agent` 会在 Docker 中全局安装打包的 OpenClaw tarball通过 env-ref 新手引导配置 OpenAI并默认配置 Telegram运行 Doctor然后运行一次模拟的 OpenAI 智能体轮次。使用 `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz` 复用预构建 tarball使用 `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0` 跳过主机重建,或使用 `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` 切换渠道。
- 更新渠道切换冒烟测试:`pnpm test:docker:update-channel-switch` 会在 Docker 中全局安装打包后的 OpenClaw tarball从 package `stable` 切换到 git `dev`,验证持久化的渠道和插件更新后工作正常,然后切回 package `stable` 并检查更新状态
- 升级幸存者冒烟测试:`pnpm test:docker:upgrade-survivor` 会把打包后的 OpenClaw tarball 安装到一个脏的旧用户 fixture 上,该 fixture 包含 agents、渠道配置、插件 allowlists、过期插件依赖状态以及现有工作区/会话文件。它会在没有在线提供商或渠道密钥的情况下运行 package update 和非交互式 Doctor然后启动一个 loopback Gateway 网关,并检查配置/状态保留以及启动/状态预算。
- 已发布版本升级幸存者冒烟测试:`pnpm test:docker:published-upgrade-survivor` 默认安装 `openclaw@latest`播种真实的现有用户文件,使用内置命令配方配置该基线,验证生成的配置,将该已发布安装更新到候选 tarball运行非交互式 Doctor写入 `.artifacts/upgrade-survivor/summary.json`,然后启动一个 loopback Gateway 网关,并检查配置的 intents、状态保留、启动、`/healthz`、`/readyz` 和 RPC 状态预算。使用 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` 覆盖一个基线,使用 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS` 让聚合调度器展开精确基线,例如 `all-since-2026.4.23`,并使用 `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` 展开 issue 形状的 fixtures,例如 `reported-issues`reported-issues 集包含 `configured-plugin-installs`,用于自动修复外部 OpenClaw 插件安装。Package Acceptance 将这些暴露为 `published_upgrade_survivor_baseline`、`published_upgrade_survivor_baselines` 和 `published_upgrade_survivor_scenarios`
- Npm tarball 新手引导/渠道/智能体冒烟测试:`pnpm test:docker:npm-onboard-channel-agent` 会在 Docker 中全局安装打包的 OpenClaw tarball通过 env-ref 新手引导配置 OpenAI并默认配置 Telegram运行 Doctor并运行一次模拟的 OpenAI 智能体回合。使用 `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz` 复用预构建 tarball使用 `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0` 跳过主机重建,或使用 `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` 切换渠道。
- 更新渠道切换冒烟测试:`pnpm test:docker:update-channel-switch` 会在 Docker 中全局安装打包好的 OpenClaw tarball从包 `stable` 切换到 git `dev`,验证持久化的渠道和插件更新后的工作情况,然后切回包 `stable` 并检查更新 Status
- 升级幸存者冒烟测试:`pnpm test:docker:upgrade-survivor` 会在一个脏的旧用户夹具上安装打包好的 OpenClaw tarball该夹具包含智能体、渠道配置、插件允许列表、陈旧的插件依赖状态以及现有工作区/会话文件。它会在没有实时提供商或渠道密钥的情况下运行包更新和非交互式 Doctor然后启动 local loopback Gateway 网关,并检查配置/状态保留以及启动/Status 预算。
- 已发布升级幸存者冒烟测试:`pnpm test:docker:published-upgrade-survivor` 默认安装 `openclaw@latest`填充真实的现有用户文件,使用内置命令配方配置该基线,验证生成的配置,将该已发布安装更新到候选 tarball运行非交互式 Doctor写入 `.artifacts/upgrade-survivor/summary.json`,然后启动 local loopback Gateway 网关,并检查已配置的意图、状态保留、启动、`/healthz`、`/readyz` 和 RPC Status 预算。使用 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` 覆盖一个基线,要求聚合调度器使用 `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS` 展开精确基线,例如 `all-since-2026.4.23`,并使用 `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` 展开 issue 形状的夹具,例如 `reported-issues`reported-issues 集包含 `configured-plugin-installs`,用于自动修复外部 OpenClaw 插件安装。Package Acceptance 将这些暴露为 `published_upgrade_survivor_baseline`、`published_upgrade_survivor_baselines` 和 `published_upgrade_survivor_scenarios`
- 会话运行时上下文冒烟测试:`pnpm test:docker:session-runtime-context` 会验证隐藏运行时上下文 transcript 持久化,以及 Doctor 对受影响的重复 prompt-rewrite 分支的修复。
- Bun 全局安装冒烟测试:`bash scripts/e2e/bun-global-install-smoke.sh` 会打包当前目录树,在隔离 home 中用 `bun install -g` 安装它,并验证 `openclaw infer image providers --json` 返回内置图像提供商而不是挂起。使用 `OPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz` 复用预构建 tarball使用 `OPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0` 跳过主机构建,或使用 `OPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local` 从已构建的 Docker 镜像复制 `dist/`
- 安装器 Docker 冒烟测试:`bash scripts/test-install-sh-docker.sh` 会在其 root、update 和 direct-npm 容器之间共享一个 npm 缓存。update 冒烟测试默认使用 npm `latest` 作为升级到候选 tarball 前的 stable 基线。在本地用 `OPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22` 覆盖,或在 GitHub 上用 Install Smoke workflow 的 `update_baseline_version` 输入覆盖。非 root 安装器检查会保留隔离的 npm 缓存,避免 root 拥有的缓存条目掩盖用户本地安装行为。设置 `OPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache` 可在本地重复运行时复用 root/update/direct-npm 缓存。
- Install Smoke CI 使用 `OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1` 跳过重复的 direct-npm 全局更新;当需要直接 `npm install -g` 覆盖时,请在本地运行脚本且不要设置该环境变量。
- Agents 删除共享工作区 CLI 冒烟测试:`pnpm test:docker:agents-delete-shared-workspace`(脚本:`scripts/e2e/agents-delete-shared-workspace-docker.sh`)默认构建根 Dockerfile 镜像,在隔离容器 home 中播种两个共享一个工作区的 agents运行 `agents delete --json`,并验证有效 JSON 与保留工作区行为。使用 `OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1` 复用 install-smoke 镜像。
- Gateway 网关网络两个容器WS auth + 健康检查):`pnpm test:docker:gateway-network`(脚本:`scripts/e2e/gateway-network-docker.sh`
- 浏览器 CDP 快照冒烟测试:`pnpm test:docker:browser-cdp-snapshot`(脚本:`scripts/e2e/browser-cdp-snapshot-docker.sh`)会构建源码 E2E 镜像和 Chromium 层,使用原始 CDP 启动 Chromium运行 `browser doctor --deep`,并验证 CDP 角色快照覆盖链接 URL、由光标提升的可点击项、iframe 引用和 frame 元数据。
- OpenAI Responses web_search 最小推理回归测试:`pnpm test:docker:openai-web-search-minimal`(脚本:`scripts/e2e/openai-web-search-minimal-docker.sh`)会通过 Gateway 网关运行一个模拟的 OpenAI server验证 `web_search``reasoning.effort``minimal` 提升到 `low`,然后强制 provider schema 拒绝并检查原始详情出现在 Gateway 网关日志中。
- MCP 渠道桥接(播种的 Gateway 网关 + stdio bridge + 原始 Claude notification-frame 冒烟测试):`pnpm test:docker:mcp-channels`(脚本:`scripts/e2e/mcp-channels-docker.sh`
- Pi bundle MCP 工具(真实 stdio MCP server + 嵌入式 Pi profile allow/deny 冒烟测试):`pnpm test:docker:pi-bundle-mcp-tools`(脚本:`scripts/e2e/pi-bundle-mcp-tools-docker.sh`
- Cron/subagent MCP 清理(真实 Gateway 网关 + stdio MCP 子进程在隔离 cron 和一次性 subagent 运行后的拆除):`pnpm test:docker:cron-mcp-cleanup`(脚本:`scripts/e2e/cron-mcp-cleanup-docker.sh`
- 插件(本地路径、`file:`、带 hoisted 依赖的 npm registry、git moving refs、ClawHub kitchen-sink、marketplace updates以及 Claude-bundle enable/inspect 的安装/更新冒烟测试):`pnpm test:docker:plugins`(脚本:`scripts/e2e/plugins-docker.sh`
设置 `OPENCLAW_PLUGINS_E2E_CLAWHUB=0` 可跳过 ClawHub 块,或使用 `OPENCLAW_PLUGINS_E2E_CLAWHUB_SPEC``OPENCLAW_PLUGINS_E2E_CLAWHUB_ID` 覆盖默认的 kitchen-sink package/runtime 对。如果没有 `OPENCLAW_CLAWHUB_URL`/`CLAWHUB_URL`,测试会使用 hermetic 本地 ClawHub fixture server。
- 插件更新无变化冒烟测试:`pnpm test:docker:plugin-update`(脚本:`scripts/e2e/plugin-update-unchanged-docker.sh`
- 配置重新加载元数据冒烟测试:`pnpm test:docker:config-reload`(脚本:`scripts/e2e/config-reload-source-docker.sh`
- 插件:`pnpm test:docker:plugins` 覆盖本地路径、`file:`、带 hoisted 依赖的 npm registry、git moving refs、ClawHub fixtures、marketplace updates以及 Claude-bundle enable/inspect 的安装/更新冒烟测试。`pnpm test:docker:plugin-update` 覆盖已安装插件的无变化更新行为。
- Bun 全局安装冒烟测试:`bash scripts/e2e/bun-global-install-smoke.sh` 会打包当前树,在隔离的 home 中使用 `bun install -g` 安装,并验证 `openclaw infer image providers --json` 返回内置图片提供商,而不是挂起。使用 `OPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz` 复用预构建 tarball使用 `OPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0` 跳过主机构建,或使用 `OPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local` 从已构建的 Docker 镜像复制 `dist/`
- 安装器 Docker 冒烟测试:`bash scripts/test-install-sh-docker.sh` 会在其 root、update 和 direct-npm 容器之间共享一个 npm 缓存。更新冒烟测试默认使用 npm `latest` 作为 stable 基线,然后升级到候选 tarball。在本地使用 `OPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22` 覆盖,或在 GitHub 上使用 Install Smoke 工作流的 `update_baseline_version` 输入覆盖。非 root 安装器检查会保留隔离的 npm 缓存,避免 root 拥有的缓存条目掩盖用户本地安装行为。设置 `OPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache` 可在本地重复运行之间复用 root/update/direct-npm 缓存。
- Install Smoke CI 使用 `OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1` 跳过重复的 direct-npm 全局更新;需要覆盖直接 `npm install -g` 时,请在本地运行不带该环境变量的脚本。
- 智能体删除共享工作区 CLI 冒烟测试:`pnpm test:docker:agents-delete-shared-workspace`(脚本:`scripts/e2e/agents-delete-shared-workspace-docker.sh`)默认构建根 Dockerfile 镜像,在隔离的容器 home 中填充两个智能体和一个工作区,运行 `agents delete --json`,并验证有效 JSON 和保留工作区行为。使用 `OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1` 复用 install-smoke 镜像。
- Gateway 网关网络两个容器WS 认证 + 健康检查):`pnpm test:docker:gateway-network`(脚本:`scripts/e2e/gateway-network-docker.sh`
- 浏览器 CDP 快照冒烟测试:`pnpm test:docker:browser-cdp-snapshot`(脚本:`scripts/e2e/browser-cdp-snapshot-docker.sh`)会构建源 E2E 镜像和一个 Chromium 层,使用原始 CDP 启动 Chromium运行 `browser doctor --deep`,并验证 CDP 角色快照覆盖链接 URL、提升为可点击项的光标、iframe 引用和 frame 元数据。
- OpenAI Responses `web_search` 最小 reasoning 回归:`pnpm test:docker:openai-web-search-minimal`(脚本:`scripts/e2e/openai-web-search-minimal-docker.sh`)会通过 Gateway 网关运行模拟的 OpenAI 服务器,验证 `web_search``reasoning.effort``minimal` 提升到 `low`,然后强制提供商 schema 拒绝,并检查原始详情出现在 Gateway 网关日志中。
- MCP 渠道桥接(已填充 Gateway 网关 + stdio bridge + 原始 Claude notification-frame 冒烟测试):`pnpm test:docker:mcp-channels`(脚本:`scripts/e2e/mcp-channels-docker.sh`
- Pi bundle MCP 工具(真实 stdio MCP 服务器 + 嵌入式 Pi profile allow/deny 冒烟测试):`pnpm test:docker:pi-bundle-mcp-tools`(脚本:`scripts/e2e/pi-bundle-mcp-tools-docker.sh`
- Cron/subagent MCP 清理(真实 Gateway 网关 + 隔离 cron 和一次性 subagent 运行后拆除 stdio MCP 子进程):`pnpm test:docker:cron-mcp-cleanup`(脚本:`scripts/e2e/cron-mcp-cleanup-docker.sh`
- 插件(针对本地路径、`file:`、带提升依赖的 npm registry、git 移动引用、ClawHub kitchen-sink、marketplace 更新,以及 Claude-bundle 启用/检查的安装/更新冒烟测试):`pnpm test:docker:plugins`(脚本:`scripts/e2e/plugins-docker.sh`
设置 `OPENCLAW_PLUGINS_E2E_CLAWHUB=0` 可跳过 ClawHub 块,或使用 `OPENCLAW_PLUGINS_E2E_CLAWHUB_SPEC``OPENCLAW_PLUGINS_E2E_CLAWHUB_ID` 覆盖默认的 kitchen-sink 包/运行时组合。没有 `OPENCLAW_CLAWHUB_URL`/`CLAWHUB_URL` 时,该测试会使用 hermetic 本地 ClawHub 夹具服务器。
- 插件更新未变化冒烟测试:`pnpm test:docker:plugin-update`(脚本:`scripts/e2e/plugin-update-unchanged-docker.sh`
- 插件生命周期矩阵冒烟测试:`pnpm test:docker:plugin-lifecycle-matrix` 会在裸容器中安装打包好的 OpenClaw tarball安装一个 npm 插件,切换启用/禁用,通过本地 npm registry 对其升级和降级,删除已安装代码,然后验证卸载仍会移除陈旧状态,同时记录每个生命周期阶段的 RSS/CPU 指标。
- 配置重载元数据冒烟测试:`pnpm test:docker:config-reload`(脚本:`scripts/e2e/config-reload-source-docker.sh`
- 插件:`pnpm test:docker:plugins` 覆盖针对本地路径、`file:`、带提升依赖的 npm registry、git 移动引用、ClawHub 夹具、marketplace 更新,以及 Claude-bundle 启用/检查的安装/更新冒烟测试。`pnpm test:docker:plugin-update` 覆盖已安装插件的未变化更新行为。`pnpm test:docker:plugin-lifecycle-matrix` 覆盖带资源跟踪的 npm 插件安装、启用、禁用、升级、降级和缺失代码卸载。
要手动预构建并复用共享 functional 镜像:
要手动预构建并复用共享功能镜像:
```bash
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-build
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channels
```
设置`OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE` 等特定于 suite 的镜像覆盖时,它们仍然优先。当 `OPENCLAW_SKIP_DOCKER_BUILD=1` 指向远程共享镜像时如果该镜像尚不在本地脚本会拉取它。QR 和安装器 Docker 测试保留各自的 Dockerfile因为它们验证的是 package/install 行为,而不是共享的已构建应用运行时。
设置后,像 `OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE` 这样的套件专用镜像覆盖项仍然优先。当 `OPENCLAW_SKIP_DOCKER_BUILD=1` 指向远程共享镜像时如果该镜像尚不在本地脚本会拉取它。QR 和安装器 Docker 测试保留自己的 Dockerfile因为它们验证的是包/安装行为,而不是共享的已构建应用运行时。
live-model Docker runners 还会以只读方式 bind-mount 当前 checkout并在容器内将其 staging 到临时 workdir。这样可以保持运行时镜像精简同时仍然针对你的精确本地 source/config 运行 Vitest。staging 步骤会跳过大型本地专用缓存和应用构建输出,例如 `.pnpm-store`、`.worktrees`、`__openclaw_vitest__`,以及应用本地 `.build` 或 Gradle 输出目录,这样 Docker 在线运行不会花费数分钟复制特定机器的 artifacts。它们还会设置 `OPENCLAW_SKIP_CHANNELS=1`,这样 Gateway 网关在线探针不会在容器内启动真实 Telegram/Discord 等渠道 worker。`test:docker:live-models` 仍然会运行 `pnpm test:live`,因此当你需要从该 Docker 通道缩小或排除 Gateway 网关在线覆盖范围时,也要透传 `OPENCLAW_LIVE_GATEWAY_*`。`test:docker:openwebui` 是更高层的兼容性冒烟测试:它会启动启用了 OpenAI 兼容 HTTP 端点的 OpenClaw gateway 容器,启动一个指向该 gateway 的固定版本 Open WebUI 容器,通过 Open WebUI 登录,验证 `/api/models` 暴露 `openclaw/default`,然后通过 Open WebUI 的 `/api/chat/completions` 代理发送真实聊天请求。首次运行可能明显更慢,因为 Docker 可能需要拉取 Open WebUI 镜像Open WebUI 也可能需要完成自己的冷启动设置。该通道需要可用的在线模型密钥,而 `OPENCLAW_PROFILE_FILE`(默认 `~/.profile`)是在 Docker 化运行中提供它的主要方式。成功运行会打印一个小 JSON 负载,例如 `{ "ok": true, "model": "openclaw/default", ... }`。`test:docker:mcp-channels` 有意保持确定性,不需要真实 Telegram、Discord 或 iMessage 账号。它会启动一个已播种的 Gateway 网关容器,再启动第二个容器来生成 `openclaw mcp serve`然后验证路由后的会话发现、transcript 读取、附件元数据、在线事件队列行为、出站发送路由,以及通过真实 stdio MCP bridge 发送的 Claude 风格渠道 + 权限通知。通知检查会直接检查原始 stdio MCP frames因此冒烟测试验证的是 bridge 实际发出的内容,而不只是某个特定 client SDK 恰好暴露的内容。`test:docker:pi-bundle-mcp-tools` 是确定性的,不需要在线模型密钥。它会构建 repo Docker 镜像,在容器内启动真实 stdio MCP probe server通过嵌入式 Pi bundle MCP runtime 实体化该 server执行工具然后验证 `coding``messaging` 保留 `bundle-mcp` 工具,而 `minimal``tools.deny: ["bundle-mcp"]` 会过滤它们。`test:docker:cron-mcp-cleanup` 是确定性的,不需要在线模型密钥。它会启动一个带真实 stdio MCP probe server 的已播种 Gateway 网关,运行一次隔离 cron 轮次和一次 `/subagents spawn` 一次性子轮次,然后验证 MCP 子进程在每次运行后退出。
实时模型 Docker 运行器还会以只读方式绑定挂载当前检出,
并在容器内将其暂存到一个临时工作目录。这样可以让运行时镜像保持精简,
同时仍然针对你确切的本地源码/配置运行 Vitest。暂存步骤会跳过大型的
仅本地缓存和应用构建输出,例如 `.pnpm-store`、`.worktrees`、
`__openclaw_vitest__`,以及应用本地的 `.build` 或 Gradle 输出目录,
这样 Docker 实时运行就不会花费数分钟复制特定机器的构件。
它们还会设置 `OPENCLAW_SKIP_CHANNELS=1`,使 Gateway 网关实时探测不会在
容器内启动真实的 Telegram/Discord 等渠道工作进程。
`test:docker:live-models` 仍会运行 `pnpm test:live`,因此当你需要从该
Docker 通道缩小或排除 Gateway 网关实时覆盖范围时,也要传入
`OPENCLAW_LIVE_GATEWAY_*`
`test:docker:openwebui` 是更高层级的兼容性冒烟测试:它会启动一个启用了
OpenAI 兼容 HTTP 端点的 OpenClaw Gateway 网关容器,启动一个固定版本的
Open WebUI 容器并连接到该 Gateway 网关,通过 Open WebUI 登录,验证
`/api/models` 暴露 `openclaw/default`,然后通过 Open WebUI 的
`/api/chat/completions` 代理发送真实聊天请求。
首次运行可能会明显更慢,因为 Docker 可能需要拉取 Open WebUI 镜像,并且
Open WebUI 可能需要完成自己的冷启动设置。
该通道期望可用的实时模型密钥,而 `OPENCLAW_PROFILE_FILE`
(默认是 `~/.profile`)是在 Docker 化运行中提供它的主要方式。
成功运行会打印一个小型 JSON 载荷,例如 `{ "ok": true, "model":
"openclaw/default", ... }`。
`test:docker:mcp-channels` 是有意设计为确定性的,并且不需要真实的
Telegram、Discord 或 iMessage 账号。它会启动一个已植入种子的 Gateway 网关
容器,再启动第二个容器来生成 `openclaw mcp serve`,然后验证路由后的对话发现、
转录读取、附件元数据、实时事件队列行为、出站发送路由,以及通过真实 stdio
MCP 桥接传递的 Claude 风格渠道 + 权限通知。通知检查会直接检查原始 stdio
MCP 帧,因此该冒烟测试验证的是桥接实际发出的内容,而不只是某个特定客户端 SDK
碰巧暴露的内容。
`test:docker:pi-bundle-mcp-tools` 是确定性的,并且不需要实时模型密钥。它会构建
仓库 Docker 镜像,在容器内启动真实的 stdio MCP 探测服务器,通过嵌入式 Pi
包 MCP 运行时物化该服务器,执行工具,然后验证 `coding``messaging` 保留
`bundle-mcp` 工具,而 `minimal``tools.deny: ["bundle-mcp"]` 会过滤它们。
`test:docker:cron-mcp-cleanup` 是确定性的,并且不需要实时模型密钥。它会启动一个
带真实 stdio MCP 探测服务器的已植入种子的 Gateway 网关,运行一次隔离的 cron
回合和一个 `/subagents spawn` 一次性子回合,然后验证每次运行后 MCP 子进程都会退出。
手动 ACP 自然语言线程冒烟测试(非 CI
- `bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...`
- 保留此脚本用于回归/调试工作流。ACP 线程路由验证以后可能还会需要它,因此不要删除它。
- 保留此脚本用于回归/调试工作流。ACP 线程路由验证可能还会再次需要它,因此不要删除它。
有用的环境变量:
- `OPENCLAW_CONFIG_DIR=...`(默认:`~/.openclaw`)挂载到 `/home/node/.openclaw`
- `OPENCLAW_WORKSPACE_DIR=...`(默认:`~/.openclaw/workspace`)挂载到 `/home/node/.openclaw/workspace`
- `OPENCLAW_PROFILE_FILE=...`(默认:`~/.profile`)挂载到 `/home/node/.profile`,并在运行测试前加载
- `OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1` 仅验证从 `OPENCLAW_PROFILE_FILE` 加载的环境变量,使用临时配置/工作区目录,并且不挂载外部 CLI 凭证
- `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...`(默认:`~/.cache/openclaw/docker-cli-tools`)挂载到 `/home/node/.npm-global`,用于在 Docker 内缓存 CLI 安装
- `OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1` 用于仅验证从 `OPENCLAW_PROFILE_FILE` 加载的环境变量,使用临时配置/工作区目录,且不挂载外部 CLI 凭证
- `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...`(默认:`~/.cache/openclaw/docker-cli-tools`)挂载到 `/home/node/.npm-global`,用于 Docker 内缓存 CLI 安装
- `$HOME` 下的外部 CLI 凭证目录/文件会以只读方式挂载到 `/host-auth...` 下,然后在测试开始前复制到 `/home/node/...`
- 默认目录:`.minimax`
- 默认文件:`~/.codex/auth.json`、`~/.codex/config.toml`、`.claude.json`、`~/.claude/.credentials.json`、`~/.claude/settings.json`、`~/.claude/settings.local.json`
- 收窄范围的提供商运行只会挂载根据 `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` 推断出的所需目录/文件
- 使用 `OPENCLAW_DOCKER_AUTH_DIRS=all`、`OPENCLAW_DOCKER_AUTH_DIRS=none`,或类似 `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` 的逗号列表手动覆盖
- `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` 用于收窄运行范围
- `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` 用于在容器内筛选提供商
- `OPENCLAW_SKIP_DOCKER_BUILD=1` 用于在无需重新构建的重复运行中复用现有 `openclaw:local-live` 镜像
- `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` 用于确保凭据来自配置文件存储(而不是环境)
- 缩小范围的提供商运行只会挂载根据 `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` 推断出的必要目录/文件
- 使用 `OPENCLAW_DOCKER_AUTH_DIRS=all`、`OPENCLAW_DOCKER_AUTH_DIRS=none`,或类似 `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` 的逗号列表手动覆盖
- `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` 用于缩小运行范围
- `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` 用于在容器内过滤提供商
- `OPENCLAW_SKIP_DOCKER_BUILD=1` 用于在不需要重新构建的重复运行中复用现有 `openclaw:local-live` 镜像
- `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` 用于确保凭证来自配置文件存储(而不是环境变量
- `OPENCLAW_OPENWEBUI_MODEL=...` 用于选择 Gateway 网关为 Open WebUI 冒烟测试暴露的模型
- `OPENCLAW_OPENWEBUI_PROMPT=...` 用于覆盖 Open WebUI 冒烟测试使用的 nonce 检查提示
- `OPENCLAW_OPENWEBUI_PROMPT=...` 用于覆盖 Open WebUI 冒烟测试使用的 nonce 检查提示
- `OPENWEBUI_IMAGE=...` 用于覆盖固定的 Open WebUI 镜像标签
## 文档完整性检查
文档编辑后运行文档检查:`pnpm check:docs`。
当你还需要检查页内标题时,运行完整的 Mintlify 锚点验证:`pnpm docs:check-links:anchors`。
当你还需要页内标题检查时,运行完整的 Mintlify 锚点验证:`pnpm docs:check-links:anchors`。
## 离线回归CI 安全)
这些是不使用真实提供商的“真实流水线”回归:
- Gateway 网关工具调用(模拟 OpenAI真实 Gateway 网关 + Agent loop`src/gateway/gateway.test.ts`(用例:“通过 Gateway 网关 Agent loop 端到端运行模拟 OpenAI 工具调用”
- Gateway 网关向导WS `wizard.start`/`wizard.next`,写入配置 + 强制执行凭证):`src/gateway/gateway.test.ts`(用例:“通过 ws 运行向导并写入凭证令牌配置”
- Gateway 网关工具调用(模拟 OpenAI真实 Gateway 网关 + Agent loop`src/gateway/gateway.test.ts`(用例:"runs a mock OpenAI tool call end-to-end via gateway agent loop"
- Gateway 网关向导WS `wizard.start`/`wizard.next`,写入配置 + 强制凭证):`src/gateway/gateway.test.ts`(用例:"runs wizard over ws and writes auth token config"
## 智能体可靠性评估Skills
我们已经有一些 CI 安全测试,其行为类似“智能体可靠性评估”:
- 通过真实 Gateway 网关 + Agent loop 进行模拟工具调用(`src/gateway/gateway.test.ts`)。
- 验证会话线和配置效果的端到端向导流程(`src/gateway/gateway.test.ts`)。
- 验证会话线和配置效果的端到端向导流程(`src/gateway/gateway.test.ts`)。
Skills 仍缺失的内容(参见 [Skills](/zh-CN/tools/skills)
Skills 仍然缺少的内容(见 [Skills](/zh-CN/tools/skills)
- **决策:** 当提示中列出 Skills 时,智能体是否选择正确的 Skill或避免不相关的 Skill
- **合规性:** 智能体是否在使用前读取 `SKILL.md` 并遵循所需步骤/参数?
- **工作流契约:** 断言工具顺序、会话历史延续和沙箱边界的多轮场景。
- **决策:** 当提示词中列出 Skills 时,智能体是否会选择正确的 skill或避开无关项
- **合规性:** 智能体是否会在使用前读取 `SKILL.md`,并遵循必需步骤/参数?
- **工作流契约:** 断言工具顺序、会话历史继承和沙箱边界的多轮场景。
未来评估应首先保持确定性:
- 使用模拟提供商的场景运行器,用于断言工具调用 + 顺序、Skill 文件读取和会话连线。
- 一小组聚焦 Skill 的场景(使用与避免、门控、提示注入)。
- 可选的实时评估(选择加入、通过环境变量门控)仅在 CI 安全套件就位后添加
- 使用模拟提供商的场景运行器,用于断言工具调用 + 顺序、skill 文件读取和会话接线。
- 一小组聚焦 skill 的场景(使用与避免、门控、提示注入)。
- 可选实时评估(选择启用、由环境变量门控)仅在 CI 安全套件就绪后再加入
## 契约测试(插件和渠道形状)
契约测试验证每个已注册的插件和渠道都符合其接口契约。它们会遍历所有发现的插件,并运行一组形状和行为断言。默认的 `pnpm test` 单元测试通道会有意跳过这些共享连接面和冒烟文件;当你触及共享渠道或提供商表面时,请显式运行契约命令。
契约测试验证每个已注册的插件和渠道都符合其接口契约。它们会遍历所有发现的插件,并运行一组形状和行为断言。默认的 `pnpm test` 单元通道会有意跳过这些共享接缝和冒烟文件;当你触碰共享渠道或提供商表面时,请显式运行契约命令。
### 命令
@ -605,21 +666,21 @@ Skills 仍缺失的内容(参见 [Skills](/zh-CN/tools/skills)
位于 `src/channels/plugins/contracts/*.contract.test.ts`
- **plugin** - 基本插件形状(id、名称、能力)
- **plugin** - 基本插件形状(ID、名称、能力)
- **setup** - 设置向导契约
- **session-binding** - 会话绑定行为
- **outbound-payload** - 消息载荷结构
- **inbound** - 入站消息处理
- **actions** - 渠道作处理器
- **actions** - 渠道作处理器
- **threading** - 线程 ID 处理
- **directory** - 目录/成员名 API
- **directory** - 目录/成员名 API
- **group-policy** - 群组策略强制执行
### 提供商状态契约
### 提供商 Status 契约
位于 `src/plugins/contracts/*.contract.test.ts`
- **status** - 渠道状态探测
- **status** - 渠道 Status 探测
- **registry** - 插件注册表形状
### 提供商契约
@ -627,9 +688,9 @@ Skills 仍缺失的内容(参见 [Skills](/zh-CN/tools/skills)
位于 `src/plugins/contracts/*.contract.test.ts`
- **auth** - 凭证流程契约
- **auth-choice** - 凭证选择/选
- **auth-choice** - 凭证选择/
- **catalog** - 模型目录 API
- **discovery** - 插件设备发现
- **discovery** - 插件发现
- **loader** - 插件加载
- **runtime** - 提供商运行时
- **shape** - 插件形状/接口
@ -639,25 +700,25 @@ Skills 仍缺失的内容(参见 [Skills](/zh-CN/tools/skills)
- 更改 plugin-sdk 导出或子路径后
- 添加或修改渠道或提供商插件后
- 重构插件注册或设备发现后
- 重构插件注册或发现后
契约测试会在 CI 中运行,并且不需要真实 API 密钥。
契约测试会在 CI 中运行,不需要真实 API 密钥。
## 添加回归(指南)
当你修复实时发现的提供商/模型问题时:
当你修复实时环境中发现的提供商/模型问题时:
- 尽可能添加 CI 安全回归(模拟/存根提供商,或捕获精确的请求形状转换)
- 如果它本质上只能实时测试(速率限制、凭证策略),请保持实时测试范围狭窄,并通过环境变量选择加入
- 优先针对能捕获该 bug 的最小层
- 提供商请求转换/重放 bug → 直接模型测试
- Gateway 网关会话/历史/工具流水线 bug → Gateway 网关实时冒烟测试或 CI 安全的 Gateway 网关模拟测试
- 尽可能添加 CI 安全回归(模拟/桩提供商,或捕获确切的请求形状转换)
- 如果它本质上只能实时验证(速率限制、凭证策略),请让实时测试保持狭窄,并通过环境变量选择启用
- 优先定位能捕获该缺陷的最小层级
- 提供商请求转换/回放缺陷 → 直接模型测试
- Gateway 网关会话/历史/工具流水线缺陷 → Gateway 网关实时冒烟测试或 CI 安全的 Gateway 网关模拟测试
- SecretRef 遍历护栏:
- `src/secrets/exec-secret-ref-id-parity.test.ts` 从注册表元数据(`listSecretTargetRegistryEntries()`)为每个 SecretRef 类派生一个采样目标,然后断言遍历段 exec id 会被拒绝。
- 如果你在 `src/secrets/target-registry-data.ts` 中添加新的 `includeInPlan` SecretRef 目标族,请更新该测试中的 `classifyTargetClass`。该测试会有意在未分类目标 id 上失败,以免新类被静默跳过。
- `src/secrets/exec-secret-ref-id-parity.test.ts` 从注册表元数据(`listSecretTargetRegistryEntries()`为每个 SecretRef 类派生一个采样目标,然后断言遍历段 exec id 会被拒绝。
- 如果你在 `src/secrets/target-registry-data.ts` 中添加新的 `includeInPlan` SecretRef 目标族,请更新该测试中的 `classifyTargetClass`。该测试会在未分类的目标 ID 上有意失败,确保新类别不能被静默跳过。
## 相关
- [实时测试](/zh-CN/help/testing-live)
- [测试实时功能](/zh-CN/help/testing-live)
- [更新和插件测试](/zh-CN/help/testing-updates-plugins)
- [CI](/zh-CN/ci)