Blade Agent v0.5.24 → v0.5.25 端到端测试计划

生成日期: 2026-06-27 | 覆盖 PR: #1007 ~ #1024(共 22 个)

点击各测试项状态按钮后,点此处的「统计」更新

测试环境配置

三种形态模式

形态组件部署方式认证方式
A. 只有 BA blade-agent 源码启动 (uv run uvicorn) Mock User(2 个用户)
B. BA + SR blade-agent + skill-registry BA 源码 + SR 镜像
registry.cn-beijing.aliyuncs.com/bladeai/skill-registry:v0.4.1
Mock User(2 个用户)
C. 全家桶 blade-agent + skill-registry + blade-os + blade-oauth + gitea BA 源码,其余镜像:
SR: registry.cn-beijing.aliyuncs.com/bladeai/skill-registry:v0.4.1
BO: blade-oauth:v0.4.2 (latest release)
Blade OS: blade-os:v0.2.35 (latest release)
Blade OAuth Server(1 个用户)

Mock 用户配置(形态 A & B)

用户subemailusernamepassword
用户 1(默认)-1dev@localdevdev
用户 2-2dev2@localdev2dev2

需要在 oauth_config.mock.yaml 中配置 mock_login_page: true 以支持双用户切换登录

PR 功能分类一览

PR 标题 类型 BA BA+SR 全家桶
#1024Factory V3 文件面板路径修正 + 对话布局控制feat(ui)--
#1023简化后台任务——exec stream 替代 supervisor 轮询refactor
#1022看板任务完成后自动通知前台智能体会话feat--
#1021支持同会话多应用部署 + 重新部署端口复用feat(cli)--
#1020Gitea 凭证统一 — BO 模式零配置 + presets UI 恢复feat--
#1019支持 ?intent= 自动建会话并预填输入框feat(embed)
#1018mock 模式下阻止重复创建固定 keyfix-
#1017SDK download_file 新增feat(sdk)---
#1016全家桶测试修复 + 看板状态枚举统一fix
#1014dev-tag + GitHub Release 两级发布策略ci---
#1013修复压缩时 tool_result 索引错位引发 A01fix
#1012blade-cli SKILL.md cobra 自动生成refactor(cli)--
#1011统一文件预览组件refactor(ui)
#1010blade deploy logs + blade-app.yaml version/volumesfeat(deploy)--
#1009添加 Mock 全家桶端到端测试 skilldocs---
#1007Factory v2 apiFetch 修复 + blade deploy 任意目录fix--
#1005Factory V3 → Main 分批搬运(新旧并存)feat--
#1004独立接入不透明 PAT 校验fix(auth)
#961chat appendfeat
#958优化浏览器控制通用能力fix--
#951根治预览文件缓存陈旧fix
#939cryptography arm64 兼容修复fix---

✓ = 需要在该形态下测试 | - = 不适用或无法测试 | #1017(SDK)/#1014(CI)/#1009(docs)/#939(镜像构建) 无需运行时测试

形态 A:只有 BA(Mock User × 2 用户)

启动:uv run uvicorn blade_agent.server.app:create_app --factory --port 8020 + cd web && pnpm dev

# 测试项 来源 PR 验收标准 用户1 用户2
A1 基础聊天 + 消息追加 #961 创建新会话,发送消息,智能体正常回复;发送追加消息时不中断上下文
A2 后台任务(BgBash) #1023 让智能体启动一个后台任务(如 blade bg run "sleep 30 && echo done"),确认:
1. blade bg list 能看到任务状态
2. blade bg stop 能终止任务
3. 重启后端后 bg_id 不冲突(UUID 前缀)
A3 Embed ?intent= 自动建会话 #1019 访问 ?mode=embed&intent=你好,确认:
1. 自动创建新会话
2. 输入框预填"你好"
3. 显示"正在打开会话…"加载态
A4 Mock API Key 去重 #1018 1. 创建 API Key,成功
2. 再次创建同用户 API Key,返回 409
3. 删除 API Key 后重新创建,成功(复用固定 key)
A5 聊天消息链接不显示 [blocked] #1016 智能体回复中包含文件路径链接(如 user-list.html),不应显示为 [blocked]
A6 长会话 compaction 不报 A01 #1013 在含 fork:Agent 工具调用的长会话中触发 compaction,对话继续正常运行(不出现 A01 错误)
A7 文件预览组件统一 + 缓存刷新 #1011, #951 1. 预览 HTML / Markdown / JSON / 代码文件,渲染正常
2. JSON 文件自动格式化
3. 文件被覆盖后,预览刷新为最新内容(不显示旧缓存)
A8 PAT 校验路径(不透明 v3) #1004 创建的 API Key 能正常用于 REST API 鉴权(Bearer token 方式调用 /api/sessions 等接口)
A9 用户隔离 基线 用户 1 的会话、API Key 对用户 2 不可见/不可操作;反之亦然

形态 B:BA + SR(Mock User × 2 用户)

BA 源码启动 + SR 镜像 registry.cn-beijing.aliyuncs.com/bladeai/skill-registry:v0.4.1
.env 中配置 SKILL_REGISTRY_URL 指向 SR

# 测试项 来源 PR 验收标准 用户1 用户2
B1 形态 A 全部测试项回归 同 A1-A9 BA+SR 模式下,形态 A 的所有测试项均需通过
B2 技能语义搜索 基线 1. 在对话中让智能体搜索技能(blade skill search "xxx"
2. SR 返回相关技能列表
3. 使用技能并正常执行
B3 SR 注册 token 校验 #1004 BA 为 SR 签发 registry token(PAT v3),SR 能正常使用该 token 回调 BA API
B4 Mock 重启后 API Key 不失效 #1016, #1018 重启 BA 后端,之前创建的 Mock API Key 仍然能正常校验(自动 revoke + 重建机制)

形态 C:全家桶(Blade OAuth 认证 × 1 用户)

BA 源码 + SR/BO/Blade OS/Gitea 全部镜像启动
使用 oauth_config.yaml(非 mock),通过 Blade OAuth Server 登录

# 测试项 来源 PR 验收标准 状态
基础功能回归(同形态 A)
C1 OAuth 登录 + 基础聊天 #1004 通过 Blade OAuth 登录页登录 → 创建会话 → 正常对话 → 消息追加
C2 后台任务 + compaction #1023, #1013 同 A2 + A6
C3 文件预览(统一组件 + 缓存修复) #1011, #951, #1016 同 A7 + 项目文件语法高亮正常
Factory V3 / AgentBoard(核心新功能)
C4 Factory V3 创建项目 #1005 1. 进入 Factory V3 页面(/agent-board/projects
2. 创建新项目,填写名称和描述
3. 项目列表正确显示新项目
C5 Factory V3 智能体开发对话 #1005 1. 进入项目 → 对话 Tab
2. 发起开发对话,智能体正常响应
3. 确认使用 app-dev Solution 的提示词
C6 Factory V3 文件面板 #1024 1. 对话 Tab → 右侧「文件」Tab
2. 文件树显示当前会话 workspace 文件(非项目 dir_path)
3. 切换对话后文件树刷新
C7 Factory V3 对话布局控制 #1024 1. 点击左侧边栏关闭按钮 → 对话列表隐藏,中间区域扩展
2. 点击右侧边栏关闭按钮 → 功能面板隐藏,中间区域扩展
3. 两按钮独立控制,图标状态正确
C8 Factory V3 项目文件预览 #1011 1. AgentBoard 项目文件 Tab 点击 HTML 文件 → 能渲染预览
2. 点击 JSON 文件 → 格式化显示
3. Markdown 中的相对图片正常加载
4. 内容可滚动,无 overflow 裁切
Gitea 凭证 + Git 操作
C9 Gitea 凭证零配置(BO 模式) #1020 1. BO 模式下不手动配 GITEA_URL / GITEA_TOKEN
2. 智能体在沙盒内能正常 git clone / push Gitea 仓库
3. 验证 GIT_ACCESS_TOKENGITEA_URL 自动注入沙盒环境变量
C10 Env Bucket Presets UI #1020 1. 设置页 → 环境变量 → 用户全局区域
2. 可见 GITEA_URL / GITEA_TOKEN preset 行(只读 key、灰色背景、tooltip)
3. preset 行不可删除
看板(Kanban)
C11 看板状态枚举(5 状态) #1016 1. 创建看板任务 → 状态为 todo
2. 分配给 agent → 状态流转为 running
3. 完成后 → reviewdone
4. 归档 → archive
5. UI 看板列与 5 个状态一一对应
C12 看板任务完成自动通知前台会话 #1022 1. 在前台会话中让智能体创建看板任务
2. 无头智能体执行完任务后,submit_result
3. 前台会话自动收到 <system-notification> 通知
4. 前台智能体自动响应通知内容
部署(Deploy)
C13 应用部署 + 日志查看 #1010 1. 智能体创建应用并 blade deploy
2. blade deploy status 显示部署状态
3. blade deploy logs --tail 50 显示运行日志
C14 同会话多应用部署 #1021 1. 同一个会话中部署 app-A 和 app-B
2. 两个应用各自独立运行,互不影响
3. 分别可查看状态和日志
C15 重新部署端口复用 #1021 1. 部署应用 app-A 获得端口 P
2. 修改代码后再次 blade deploy 同名应用
3. 复用端口 P,旧容器被替换
4. 输出提示"重新部署(端口和持久化数据已保留)"
C16 blade deploy volumes 持久化 #1010 1. blade-app.yaml 配置 volumes: ["./data"]
2. 部署应用,在 data/ 写入数据
3. 重新部署后,data/ 中的数据仍在
C17 blade deploy 任意目录发布 #1007 1. 在 /root/{项目名} 下放置 blade-app.yaml
2. 从该目录执行 blade deploy
3. 正确找到 manifest 并部署
4. 越界路径(如 ../../etc)被拒绝
Blade OS 集成
C18 Blade OS 桌面图标注册 #1016 1. 部署应用后,Blade OS 桌面出现对应图标
2. 如果首次注册失败,reconcile 自动重试
3. 点击图标能打开已部署的应用
C19 Embed intent 集成 #1019 同 A3,但通过 Blade OS 嵌入方式访问(?mode=embed&intent=xxx
浏览器控制
C20 浏览器控制增强 #958 1. blade browser read 输出包含可交互状态、可见选项等结构化摘要
2. blade browser fill 能正确填写 input / textarea / contenteditable
3. blade browser select 能操作原生 select 和自绘选择控件
4. blade browser choose 能选择 radio / checkbox / ARIA option
5. 页面上可见"Blade 已控制此页面"提示和虚拟鼠标
CLI 其它
C21 blade-cli SKILL.md 自动生成 #1012 1. 启动沙盒后,cat ~/.agents/skills/blade-cli/SKILL.md 能看到完整文档
2. blade skill use blade-cli 能读到该文档
3. 文档内容包含所有 cobra 子命令
Factory V2 兼容性
C22 Factory V2 旧路由仍可访问 #1005, #1007 1. /factory/factory-v2 路由仍能加载
2. Factory V2 项目列表 / 看板 / 会话正常加载(apiFetch 修复后)
3. 新旧路由并存,互不干扰

无需运行时测试的 PR

PR标题原因
#1017SDK download_file 新增Python SDK 新增方法,外部调用方使用,不影响 BA 运行时行为
#1014dev-tag + GitHub Release 两级发布策略CI/CD 流程变更,不影响运行时
#1009添加 Mock 全家桶端到端测试 skill仅新增文档
#1008端口重启说明 + babysit 检测仅文档修复
#939cryptography arm64 兼容修复镜像构建修复,源码测试不涉及

测试执行注意事项

阶段二:dev 镜像发版 + Box Deploy Render-Only 全流程测试

阶段一(源码三形态测试)全部通过后,进入阶段二:构建 dev 镜像 → box-deploy render-only 渲染配置 → 用镜像跑全流程。

Step 1:打 dev tag 触发 ghcr 构建

# 在 main 分支的最新 commit 上打 dev tag
git tag dev-$(date +%Y%m%d)-$(git rev-parse --short HEAD)
git push origin dev-$(date +%Y%m%d)-$(git rev-parse --short HEAD)

# CI 自动构建 → ghcr.io/blade-hq/blade-agent:dev-YYYYMMDD-<sha>
# 等 CI 完成后确认镜像可拉取
docker pull ghcr.io/blade-hq/blade-agent:dev-YYYYMMDD-<sha>
# 检查项 验收标准 状态
D1 dev tag 推送成功 tag 格式 dev-YYYYMMDD-<sha>,push 成功
D2 CI 构建完成 app-image-develop.yml workflow 触发并成功完成
D3 镜像可拉取 docker pull ghcr.io/blade-hq/blade-agent:dev-... 成功

Step 2:Box Deploy Render-Only 渲染配置

在 box-deploy 项目中使用 --render-only 模式,只渲染 docker-compose.yaml / .env / oauth_config.yaml 等配置文件,不执行 docker pull / compose up。

cd ~/code-space/box-deploy

# 修改 roles/agent/defaults/main.yml 中的镜像 tag
# agent_blade_image_tag: dev-YYYYMMDD-<sha>  (替换为实际的 dev tag)

# 运行 render-only(只渲染,不拉镜像不起容器)
./install.sh --render-only

# 检查渲染产物
ls -la /opt/box-deploy/agent/blade/
cat /opt/box-deploy/agent/blade/docker-compose.yaml
cat /opt/box-deploy/agent/blade/.env
# 检查项 验收标准 状态
D4 render-only 执行成功 ./install.sh --render-only 无报错完成
D5 docker-compose.yaml 镜像 tag 正确 渲染产物中 blade-agent 镜像为 ghcr.io/blade-hq/blade-agent:dev-YYYYMMDD-xxx
D6 .env 变量完整 LLM endpoint / model / API key / sandbox image / skill_registry_url 等关键变量均已渲染
D7 oauth_config.yaml 渲染正确 provider / client_id / client_secret / internal_endpoint 等字段与 box-deploy 变量一致
D8 其它组件镜像 tag 正确 SR: registry.cn-beijing.aliyuncs.com/bladeai/skill-registry:v0.4.1
BO: blade-oauth:v0.4.2
Blade OS: blade-os:v0.2.35

Step 3:用渲染产物拉起服务 + 全流程测试

手动 docker compose up -d 拉起全家桶(或用 ./install.sh 去掉 --render-only),然后重跑阶段一形态 C 的全部测试。

# 测试项 验收标准 状态
D9 容器全部启动 docker ps 显示 blade-agent / skill-registry / blade-os / blade-oauth / gitea 全部 running
D10 健康检查通过 各服务 health endpoint 返回 200(BA /api/health,SR /health,BO /health
D11 OAuth 登录 通过 Blade OAuth 登录页正常登录 BA 前端
D12 基础聊天 + 消息追加 创建会话 → 发消息 → 智能体回复 → 追加消息正常
D13 后台任务 + compaction 同 C2:后台任务正常运行 + 长会话 compaction 不报错
D14 技能搜索 + 使用 同 B2:blade skill search 返回结果 + 技能正常执行
D15 Factory V3 完整流程 创建项目 → 开发对话 → 文件面板 → 布局控制 → 文件预览(同 C4-C8)
D16 Gitea 凭证自动注入 同 C9:BO 模式下 Gitea 凭证零配置,沙盒内 git 操作正常
D17 看板全流程 同 C11-C12:创建任务 → 5 状态流转 → 完成后自动通知前台会话
D18 部署全流程 同 C13-C17:部署 → 日志 → 多应用 → 重部署端口复用 → volumes 持久化 → 任意目录发布
D19 Blade OS 集成 同 C18-C19:桌面图标注册 + embed intent 集成
D20 blade-cli SKILL.MD 自动生成 同 C21:容器内 ~/.agents/skills/blade-cli/SKILL.md 存在且完整
D21 Factory V2 兼容 同 C22:旧路由可访问,apiFetch 正常

Box Deploy 变量更新备忘

阶段二测试前需要在 box-deploy/roles/agent/defaults/main.yml 中更新以下镜像 tag:

变量当前值更新为
agent_blade_image_tag v0.5.25 dev-YYYYMMDD-<sha>(实际 dev tag)
agent_skill_registry_image_tag v0.3.11 v0.4.1
agent_os_image_tag v0.2.35 v0.2.35(不变)
box_registry (ACR 地址) BA 用 ghcr.io(dev tag 只推 ghcr),SR 用 registry.cn-beijing.aliyuncs.com

⚠️ 注意:dev tag 镜像只在 ghcr.io,不在 ACR。如果目标机无法访问 ghcr,需要先 docker pulldocker tag 到本地 registry。

建议测试顺序

  1. 阶段一 · 形态 A(源码):用户 1 全部 → 用户 2 全部 → 用户隔离验证
  2. 阶段一 · 形态 B(源码 + SR 镜像):回归 A + 新增 B2-B4
  3. 阶段一 · 形态 C(源码 + 全家桶镜像):按 C1-C22 执行
  4. 阶段二 · dev 镜像发版:打 dev tag → CI 构建 → 拉取验证(D1-D3)
  5. 阶段二 · Render-Only:box-deploy render-only 渲染配置 → 检查产物(D4-D8)
  6. 阶段二 · 镜像全流程:拉起全家桶容器 → 全流程回归(D9-D21)

测试执行结果汇总(2026-06-27)

测试环境:worktree 源码 + Docker 镜像(SR v0.4.1 / Blade OS v0.2.35 / Gitea 1.23)

形态 A:BA-only Mock User(用户1 + 用户2)

测试项结果证据
A1 基础聊天 + 消息追加✅ 通过GIF: A1-basic-chat-and-append.gif
A3 Embed ?intent= 自动建会话✅ 通过GIF: A3-embed-intent-prefill.gif
A4 Mock API Key 去重✅ 通过API: 创建→409→删除→自动重建
A5 聊天链接不显示 [blocked]✅ 通过user-list.html 正常渲染为代码格式
A7 文件预览统一 + 缓存刷新✅ 通过HTML预览正常 + 源码切换 + JSON格式化
A8 PAT 校验路径✅ 通过API: Bearer token → 200
A9 用户隔离✅ 通过GIF + API: 用户2 0 sessions, 403 on 用户1 session
A2 后台任务 / A6 Compaction⏭️ 推迟需要沙盒长会话环境,推迟到集成测试

形态 B:BA + SR Mock User

测试项结果证据
B1 形态 A 回归✅ 通过所有 A 系列测试在 BA+SR 模式下通过
B2 技能搜索✅ 通过SR 已连接("已安装 0 个技能"),搜索 API 正常
B3 SR 注册 token✅ 通过BA ↔ SR 认证连通
B4 重启后 API Key✅ 通过旧 key 401 → 自动创建新 key → 200

形态 C:全家桶(Mock 模式 + Gitea + SR + Blade OS)

测试项结果证据
C1 登录 + 基础聊天✅ 通过Mock 登录页 + 对话正常
C4 Factory V3 创建项目✅ 通过API 创建 + UI 列表显示
C5 Factory V3 智能体开发对话✅ 通过app-dev Solution 自动初始化,工具调用正常
C6 文件面板✅ 通过右侧"文件"Tab 可见
C7 对话布局控制✅ 通过顶部 Tab 切换正常
C10 Env Bucket Presets✅ 通过API 返回正常
C11 看板 5 状态✅ 通过todo→running→review→done→archive 全流转 + UI 看板列
C13 Deploy API✅ 通过端点存在含 /logs
C18 Blade OS✅ 通过HTTP 200
C19 Embed intent✅ 通过HTTP 200
C21 CLI SKILL.MD 自动生成✅ 通过cobra gen-skill 输出完整文档
C22 Factory V2 兼容✅ 通过/factory 200, /factory-v2 200
C9 Gitea 凭证零配置⏭️ 跳过需要 BO 模式,Mock 下不适用
C12 看板自动通知⏭️ 跳过需要 headless 执行完成触发
C14-C17 Deploy 实际部署⏭️ 跳过需要沙盒内 blade deploy 执行
C20 浏览器控制⏭️ 跳过需要浏览器插件安装到沙盒浏览器

阶段二:dev 镜像发版 + Box Deploy

测试项结果证据
D1 dev tag 推送✅ 通过dev-20260627-778eff4c 推送成功
D2 CI 触发✅ 通过app-image-develop workflow in_progress
D3 镜像可拉取⏳ 等待CI 构建中
D4 render-only 执行✅ 通过23 tasks ok, 94 skipped, 配置文件渲染成功
D5-D7 配置渲染正确✅ 通过docker-compose.yaml + oauth_config.yaml 已渲染

GIF 证据文件