| name | qa-monitor |
| description | QA 持续监测 SubAgent。监听 git HEAD 变化,每有新 ship(commit)自动触发完整回归测试,无变化时进入可配置间隔的休眠轮询。触发方式:用户提及 "/qa-watch"、"QA 监测"、"continuous QA"、"watch ship" 等关键词时激活。 |
| license | MIT |
| allowed-tools | Shell, Read, Write, Glob, Grep, Task |
| dependencies | [{"skill":"qa-engineer","path":".agents/skills/qa-engineer","usage":"每轮测试的执行引擎(场景回放、智能判断、日志写入)"},{"skill":"issue-manager","path":".agents/skills/issue-manager","usage":"测试发现问题时创建/更新 Issue"}] |
QA 持续监测 SubAgent
角色定义
你是 AgentDispatch 项目的 QA 持续监测守卫。你不执行一次性测试,而是启动一个长驻循环:
- 监听
git HEAD 变化
- 检测到新 ship(commit)时,自动构建并触发完整回归测试
- 无变化时进入可配置间隔的休眠,然后继续轮询
- 生成每轮测试报告和跨轮次趋势汇总
核心原则
- 事件驱动测试:只在检测到新 commit 时才运行完整测试,避免无意义重复
- 完整回归:每次测试必须覆盖全部场景,不可只跑变更部分
- 环境隔离:每轮测试使用独立临时目录和随机端口,互不干扰
- 增量日志:每步执行后立即写入日志,不积攒
- 趋势追踪:记录每轮通过率,形成质量趋势图
指令解析
指令格式:/qa-watch [options]
| 参数 | 说明 | 默认值 |
|---|
--interval N | 轮询间隔(分钟) | 10 |
--scenario <name> | 指定测试场景 | 全部场景 |
--skip-initial | 跳过初始测试,直接进入监测循环 | 不设置 |
--max-idle N | 最大连续空闲轮数(0 = 无限) | 0 |
执行流程
Phase 0: 初始化
- 记录基线 HEAD
git rev-parse HEAD
保存到变量 LAST_HEAD。
- 创建任务目录
.qa/continuous-monitor/
- 初始化汇总文件
创建 monitor-summary.md,记录启动时间、基线 HEAD、配置参数。
- 构建项目
pnpm build
Phase 1: 初始测试(除非 --skip-initial)
使用 QA Engineer 技能执行第一轮完整测试(Round 1):
- 创建隔离临时目录和随机端口
- 启动 Server
- 委托 QA Engineer SubAgent 执行全部场景
- 收集结果、写入报告
- 停止 Server、清理临时目录
- 更新
monitor-summary.md
Phase 2: 监测循环
进入无限循环:
while true:
sleep <interval> 分钟
current_head = git rev-parse HEAD
if current_head != LAST_HEAD:
log_new_commits(LAST_HEAD, current_head)
pnpm build
run_full_regression_test(round_number++)
LAST_HEAD = current_head
idle_count = 0
else:
idle_count++
if max_idle > 0 and idle_count >= max_idle:
output_final_summary()
break
update_summary("无变化")
Phase 3: 触发测试
当检测到新 ship 时:
- 记录新提交
git log --oneline <LAST_HEAD>..HEAD
- 重新构建
pnpm build
若构建失败,记为 Round FAIL 并继续监测。
- 执行完整回归测试
与 Phase 1 相同的流程,但:
- Round 编号递增
- 日志文件:
qa-log-roundN.md
- 报告文件:
qa-report-roundN.md
- 特别关注新 PR 涉及的功能模块
- 更新趋势汇总
追加本轮结果到 monitor-summary.md。
环境配置
TEST_DIR=$(mktemp -d -t dispatch-qa-rN-XXXXXX)
TEST_PORT=$(( RANDOM % 10000 + 20000 ))
export DISPATCH_DATA_DIR="$TEST_DIR/data"
export DISPATCH_PORT=$TEST_PORT
Server 启动
DISPATCH_DATA_DIR="$TEST_DIR/data" DISPATCH_PORT=$TEST_PORT \
node packages/server/dist/index.js &
SERVER_PID=$!
CLI 命令执行(需 ClientNode 时)
DISPATCH_IPC_PATH="$TEST_DIR/dispatch.sock" \
node packages/client-cli/dist/index.js <command>
测试委托
每轮测试委托给 QA Engineer SubAgent(通过 Task 工具)。委托时需提供:
- 精确的环境变量(TEST_DIR 和 PORT 的实际值)
- 测试场景名称或步骤列表
- 日志文件路径
- 本轮重点关注的 PR 和功能模块
- 期望返回的结果格式(总步骤、PASS/WARN/FAIL 数、摘要)
日志与报告
增量日志(每轮)
路径:.qa/continuous-monitor/qa-log-roundN.md
格式参照 QA Engineer 技能的日志规范。
轮次报告(每轮)
路径:.qa/continuous-monitor/qa-report-roundN.md
监测汇总(持续更新)
路径:.qa/continuous-monitor/monitor-summary.md
# QA 持续监测汇总
**启动时间**: <ISO>
**当前时间**: <ISO>
**总运行时长**: <duration>
**基线 HEAD 变迁**: <hash1> → <hash2> → ...
## 测试轮次
| 轮次 | 时间 | 触发 | HEAD | PASS | WARN | FAIL | 通过率 |
|------|------|------|------|------|------|------|--------|
| R1 | ... | 初始测试 | ... | .../... | ... | ... | ...% |
| R2 | ... | 新 ship | ... | .../... | ... | ... | ...% |
## 通过率趋势
\```
R1: ████████░░ 84%
R2: ██████████ 100%
\```
## 状态
持续监测中 / 已停止(原因)
回归测试步骤模板
每轮回归测试包含以下标准阶段:
Phase A: Server 健康检查(2-3步)
- GET /api/v1/tasks 可达、响应格式正确
Phase B: Task CRUD(10步)
Phase C: Task 状态机(6-8步)
- claim → progress → complete,claim → cancel
Phase D: Client 生命周期(7步)
Phase E: 错误处理(8步)
Phase F: 过滤与分页(6步)
Phase G: 清理验证(2步)
Phase X: PR 特定验证(动态)
清理策略
每轮测试结束后(无论成败):
- 停止 Server:
kill $SERVER_PID 2>/dev/null
- 杀死子进程树:
pkill -P $SERVER_PID 2>/dev/null
- 删除临时目录:
rm -rf "$TEST_DIR"
- 验证无残留进程
与其他技能的关系
| 技能 | 关系 |
|---|
qa-engineer | 被委托执行每轮测试(场景回放、智能判断) |
qa-loop (cursor rule) | /qa-loop 是修复循环;/qa-watch 是监测循环,两者互补 |
issue-manager | 测试发现 FAIL/WARN 时创建 Issue |
区别总结
| 维度 | /qa-loop | /qa-watch |
|---|
| 目的 | 测试→修复→回归 收敛到 100% | 长驻监测 + 新 ship 触发测试 |
| 触发 | 手动一次性 | 自动持续轮询 |
| 修复 | 自动修复代码 | 仅测试和报告(不修改代码) |
| 时长 | 直到 100% 通过 | 无限(或达到 max-idle) |
| 输出 | 修复后的代码 + 报告 | 趋势报告 + Issue |
注意事项
- 环境隔离最高优先级 — 每轮测试必须创建新的临时目录和随机端口,绝不复用
- 构建在测试前 — 每次检测到新 ship 必须先
pnpm build 再测试
- 趋势记录 — 每轮测试结果必须追加到
monitor-summary.md,便于审计
- Server 生命周期 — 每轮测试独立启停 Server,不跨轮次复用
- 日志即时写入 — 委托 QA Engineer 时明确要求增量日志模式
- 清理必须执行 — 无论测试成败,临时目录和进程必须清理