生成日期: 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.1BO: blade-oauth:v0.4.2 (latest release)Blade OS: blade-os:v0.2.35 (latest release)
|
Blade OAuth Server(1 个用户) |
| 用户 | sub | username | password | |
|---|---|---|---|---|
| 用户 1(默认) | -1 | dev@local | dev | dev |
| 用户 2 | -2 | dev2@local | dev2 | dev2 |
需要在 oauth_config.mock.yaml 中配置 mock_login_page: true 以支持双用户切换登录
| PR | 标题 | 类型 | BA | BA+SR | 全家桶 |
|---|---|---|---|---|---|
| #1024 | Factory V3 文件面板路径修正 + 对话布局控制 | feat(ui) | - | - | ✓ |
| #1023 | 简化后台任务——exec stream 替代 supervisor 轮询 | refactor | ✓ | ✓ | ✓ |
| #1022 | 看板任务完成后自动通知前台智能体会话 | feat | - | - | ✓ |
| #1021 | 支持同会话多应用部署 + 重新部署端口复用 | feat(cli) | - | - | ✓ |
| #1020 | Gitea 凭证统一 — BO 模式零配置 + presets UI 恢复 | feat | - | - | ✓ |
| #1019 | 支持 ?intent= 自动建会话并预填输入框 | feat(embed) | ✓ | ✓ | ✓ |
| #1018 | mock 模式下阻止重复创建固定 key | fix | ✓ | ✓ | - |
| #1017 | SDK download_file 新增 | feat(sdk) | - | - | - |
| #1016 | 全家桶测试修复 + 看板状态枚举统一 | fix | ✓ | ✓ | ✓ |
| #1014 | dev-tag + GitHub Release 两级发布策略 | ci | - | - | - |
| #1013 | 修复压缩时 tool_result 索引错位引发 A01 | fix | ✓ | ✓ | ✓ |
| #1012 | blade-cli SKILL.md cobra 自动生成 | refactor(cli) | - | - | ✓ |
| #1011 | 统一文件预览组件 | refactor(ui) | ✓ | ✓ | ✓ |
| #1010 | blade deploy logs + blade-app.yaml version/volumes | feat(deploy) | - | - | ✓ |
| #1009 | 添加 Mock 全家桶端到端测试 skill | docs | - | - | - |
| #1007 | Factory v2 apiFetch 修复 + blade deploy 任意目录 | fix | - | - | ✓ |
| #1005 | Factory V3 → Main 分批搬运(新旧并存) | feat | - | - | ✓ |
| #1004 | 独立接入不透明 PAT 校验 | fix(auth) | ✓ | ✓ | ✓ |
| #961 | chat append | feat | ✓ | ✓ | ✓ |
| #958 | 优化浏览器控制通用能力 | fix | - | - | ✓ |
| #951 | 根治预览文件缓存陈旧 | fix | ✓ | ✓ | ✓ |
| #939 | cryptography arm64 兼容修复 | fix | - | - | - |
✓ = 需要在该形态下测试 | - = 不适用或无法测试 | #1017(SDK)/#1014(CI)/#1009(docs)/#939(镜像构建) 无需运行时测试
启动: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 不可见/不可操作;反之亦然 | ||
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 + 重建机制) |
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_TOKEN 和 GITEA_URL 自动注入沙盒环境变量
|
|
| C10 | Env Bucket Presets UI | #1020 |
1. 设置页 → 环境变量 → 用户全局区域 2. 可见 GITEA_URL / GITEA_TOKEN preset 行(只读 key、灰色背景、tooltip) 3. preset 行不可删除 |
|
| 看板(Kanban) | ||||
| C11 | 看板状态枚举(5 状态) | #1016 |
1. 创建看板任务 → 状态为 todo2. 分配给 agent → 状态流转为 running3. 完成后 → review → done4. 归档 → archive5. UI 看板列与 5 个状态一一对应 |
|
| C12 | 看板任务完成自动通知前台会话 | #1022 |
1. 在前台会话中让智能体创建看板任务 2. 无头智能体执行完任务后,submit_result 3. 前台会话自动收到 <system-notification> 通知4. 前台智能体自动响应通知内容 |
|
| 部署(Deploy) | ||||
| C13 | 应用部署 + 日志查看 | #1010 |
1. 智能体创建应用并 blade deploy2. 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.yaml2. 从该目录执行 blade deploy3. 正确找到 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 / contenteditable3. blade browser select 能操作原生 select 和自绘选择控件4. blade browser choose 能选择 radio / checkbox / ARIA option5. 页面上可见"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 | 标题 | 原因 |
|---|---|---|
| #1017 | SDK download_file 新增 | Python SDK 新增方法,外部调用方使用,不影响 BA 运行时行为 |
| #1014 | dev-tag + GitHub Release 两级发布策略 | CI/CD 流程变更,不影响运行时 |
| #1009 | 添加 Mock 全家桶端到端测试 skill | 仅新增文档 |
| #1008 | 端口重启说明 + babysit 检测 | 仅文档修复 |
| #939 | cryptography arm64 兼容修复 | 镜像构建修复,源码测试不涉及 |
oauth_config.mock.yaml 中设置 mock_login_page: true,并在 mock_users 列表中配置两个用户(blade-auth-client ≥0.4.13 支持)configs/ 目录:ln -s <主仓库>/configs <worktree>/configskill $(lsof -nP -tiTCP:8020 -sTCP:LISTEN),先 lsof 确认进程名再精确 kill.env 和 oauth_config 后重启后端registry.cn-beijing.aliyuncs.com/bladeai/skill-registry:v0.4.1阶段一(源码三形态测试)全部通过后,进入阶段二:构建 dev 镜像 → box-deploy render-only 渲染配置 → 用镜像跑全流程。
# 在 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-... 成功 |
在 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.1BO: blade-oauth:v0.4.2Blade OS: blade-os:v0.2.35
|
手动 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/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 pull 再 docker tag 到本地 registry。
测试环境:worktree 源码 + Docker 镜像(SR v0.4.1 / Blade OS v0.2.35 / Gitea 1.23)
| 测试项 | 结果 | 证据 |
|---|---|---|
| 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 | ⏭️ 推迟 | 需要沙盒长会话环境,推迟到集成测试 |
| 测试项 | 结果 | 证据 |
|---|---|---|
| B1 形态 A 回归 | ✅ 通过 | 所有 A 系列测试在 BA+SR 模式下通过 |
| B2 技能搜索 | ✅ 通过 | SR 已连接("已安装 0 个技能"),搜索 API 正常 |
| B3 SR 注册 token | ✅ 通过 | BA ↔ SR 认证连通 |
| B4 重启后 API Key | ✅ 通过 | 旧 key 401 → 自动创建新 key → 200 |
| 测试项 | 结果 | 证据 |
|---|---|---|
| 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 浏览器控制 | ⏭️ 跳过 | 需要浏览器插件安装到沙盒浏览器 |
| 测试项 | 结果 | 证据 |
|---|---|---|
| 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 已渲染 |
~/Downloads/0524-release/A1-basic-chat-and-append.gif — 基础聊天 + 消息追加~/Downloads/0524-release/A3-embed-intent-prefill.gif — Embed intent 预填~/Downloads/0524-release/A9-user-isolation-login-switch.gif — 用户隔离 + 登录切换~/Downloads/0524-release/C4-C7-factory-v3-project.gif — Factory V3 项目创建/对话/看板