# ai-test
**Repository Path**: mingwuda/ai-test
## Basic Information
- **Project Name**: ai-test
- **Description**: ai测试工具
- **Primary Language**: JavaScript
- **License**: Apache-2.0
- **Default Branch**: codex/devloop-remote-ai-bridge
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2026-04-01
- **Last Updated**: 2026-05-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# AI 工程协作管理服务(Node.js)
一个纯 Node.js Web 服务,用于管理需求目录、需求流转、AI 自动测试、DevLoop 开发闭环和 AI Data Agent 数据开发 POC。平台支持 Gemini / OpenCode Serve 等模型引擎,覆盖从需求录入、用例生成与执行、开发实现、数据 SQL 生成验证到历史报告导出的多类 AI 工程协作场景。
## 1. 主要能力
- 需求管理:
- 提供独立的需求管理页面
- 支持新增、编辑、删除、查询需求
- 支持上传需求文档并自动转换为 Markdown 后回填
- 用例管理:按需求查看、手工新增、编辑、删除
- AI 生成用例:
- 默认走模型引擎(Gemini CLI / OpenCode Serve)
- 用例数自动按需求复杂度估算
- 同一需求二次生成会覆盖该需求下历史 AI 用例
- 支持异步生成任务与进度查询(含流式日志)
- 支持本地 Skill 包与上传 Skill Zip(含 `SKILL.md` + 依赖文件)
- 批量执行:
- 执行链路固定为单机单并发(稳定优先)
- 新增 `agent-gemini` 模式:由 Windows Node.js Agent 在本地拉任务并执行
- 新增 `agent-script` 模式:先人工审核脚本,再由 Windows Agent 执行审核通过脚本
- Gemini / OpenCode Serve 预设当前都统一生成并执行 Playwright 脚本
- 默认 20 分钟超时(可配置)
- 支持“快速执行模式”(默认开启,约束精简输出,但不强制指定模型)
- 执行时主技能可选,不选也可直接执行
- 样例导入用例(`sample-import`)禁止进入执行链路
- 保存每条用例的执行状态、报告、Gemini 输出日志
- 支持查看单条用例执行时的提示词与 Gemini 原始返回,便于排查
- 历史批次:
- 查看历史执行批次及明细
- 勾选多个批次导出真正 `.docx` 汇总报告
- 网络自检:
- 检查网络环境变量、当前引擎真实调用
- DevLoop 开发闭环:
- 需求澄清:AI 自动分析需求,生成验收标准,识别歧义点
- 任务拆分:AI 学习代码结构,自动拆分开发任务
- 开发流程管理:支持完整的开发、构建部署流水线、测试、诊断、修复、评审流程
- 支持“用户本地 WebSocket Agent”:DevLoop 服务端负责任务编排,AI 命令在用户本机执行
- 阶段出口检查:确保每个阶段完成质量
- 人工干预机制:在必要时提供人工调整能力
- 支持 OpenCode Serve 和 Gemini 双引擎
## 1.1 AI Data Agent POC
AI Data Agent POC 演示面向员工域的数据开发闭环:
```text
Requirement -> Requirement Plan -> SQL -> Doris execution -> repair loop -> rule tests -> final run trace
```
本地页面:
```text
http://127.0.0.1:8012/ai-data-agent.html
```
主页入口:
```text
http://127.0.0.1:8012/
```
主要 API:
- `POST /api/ai-data-agent/runs`
- `GET /api/ai-data-agent/runs/:runId`
- `GET /api/ai-data-agent/runs`
真实 Doris 演示环境变量:
- `DORIS_HOST`
- `DORIS_PORT`
- `DORIS_USER`
- `DORIS_PASSWORD`
- `DORIS_DATABASE`
可选 sqlglot 服务变量:
- `SQLGLOT_SERVICE_URL`:未设置时使用内置简单 SELECT 回退转换;设置后调用 Flask sqlglot 服务。
补充文档:
- 设计说明:[docs/superpowers/specs/2026-05-07-ai-data-agent-poc-design.md](docs/superpowers/specs/2026-05-07-ai-data-agent-poc-design.md)
- 实施计划:[docs/superpowers/plans/2026-05-07-ai-data-agent-poc.md](docs/superpowers/plans/2026-05-07-ai-data-agent-poc.md)
- Demo 用例:[docs/ai-data-agent-demo-cases.md](docs/ai-data-agent-demo-cases.md)
## 1.2 架构图

Mermaid 源码:
```mermaid
flowchart LR
user["用户 / 测试 / 开发 / 数据同学"]
web["Web 工作台
public/*.html + public/*.js"]
server["Node.js 服务端
src/server.js"]
prompt["提示词配置
/api/prompt-config"]
db["本地状态存储
data/app.sqlite"]
artifacts["执行产物
data/artifacts/"]
skill["Skill 包
Zip / SKILL.md / 依赖文件"]
cli["模型引擎
Gemini CLI / OpenCode Serve"]
agent["Windows Agent
agent/index.js"]
playwright["Playwright 执行器
plan / script runner"]
user --> web
web --> server
web --> prompt
prompt --> server
server --> db
server --> artifacts
skill --> server
server --> cli
server --> playwright
server --> agent
agent --> cli
agent --> playwright
agent --> artifacts
cli -. 生成用例 / 试跑探测 / 草稿生成 .-> server
playwright -. 脚本测试 / 执行结果 / 截图 .-> server
server -. 任务进度 / 日志 / 报告 .-> web
```
## 1.3 DevLoop 架构图(WebSocket Agent 模式)

Mermaid 源码:
```mermaid
flowchart LR
subgraph userB_zone["用户 B 本地环境"]
userB["开发者 B"]
agentB["WebSocket Agent B
agent/ws-client.js"]
cliB["本地 AI CLI
Gemini / OpenCode"]
repoB["本地代码仓库"]
end
subgraph server_zone["Node.js 服务端"]
web["DevLoop 工作台
public/devloop.html"]
controller["DevLoop 控制器
src/server/controllers/dev-loop-controller.js"]
service["DevLoop 服务
src/server/services/dev-loop-service.js"]
handlers["阶段处理器
src/server/services/dev-loop-stage-handlers/"]
bridge["WebSocket 桥接器
src/server/services/ai-websocket-bridge.js"]
registry["Agent 注册表
按 ownerId 隔离"]
store["状态管理
src/server/services/state-store.js"]
end
subgraph userA_zone["用户 A 本地环境"]
userA["开发者 A"]
agentA["WebSocket Agent A
agent/ws-client.js"]
cliA["本地 AI CLI
Gemini / OpenCode"]
repoA["本地代码仓库"]
end
userB -->|"访问工作台
携带用户 B Token"| web
userA -->|"访问工作台
携带用户 A Token"| web
web -->|"请求数据 / 阶段操作"| controller
controller -->|"按 Token 解析 ownerId"| service
service -->|"阶段推进"| handlers
service -->|"AI 执行请求"| bridge
service -->|"读写用户隔离状态"| store
bridge -->|"注册 / 心跳 / 状态"| registry
bridge -. "Token 认证 / ownerId 路由 / AI 执行请求" .-> agentB
bridge -. "Token 认证 / ownerId 路由 / AI 执行请求" .-> agentA
agentB -. "AI 执行结果" .-> bridge
agentA -. "AI 执行结果" .-> bridge
agentB --> cliB
agentB --> repoB
agentA --> cliA
agentA --> repoA
handlers -. "阶段结果" .-> service
bridge -. "执行结果" .-> service
service -. "状态变更" .-> controller
controller -. "响应数据" .-> web
style userA_zone fill:#fffde7,stroke:#d6c35a
style userB_zone fill:#fffde7,stroke:#d6c35a
style server_zone fill:#fffde7,stroke:#d6c35a
```
说明:
- 管理台负责需求、用例、脚本审核、历史批次与提示词配置。
- 服务端负责路由编排、任务状态管理、脚本生命周期、报告汇总与数据持久化。
- 模型引擎主要用于生成测试用例、试跑探测、脚本草稿与部分执行辅助。
- Playwright 是当前主执行链路,负责脚本测试、正式执行、截图和浏览器交互。
- Windows Agent 主要用于测试用例执行页中需要本机环境执行的 `agent-gemini` / `agent-script` 模式。
- **用户本地 WebSocket Agent**:用于 DevLoop 中的开发、诊断、修复阶段,把 AI CLI 命令放到用户本机执行。
- **多用户隔离机制**:WebSocket Agent 连接时通过 Token 绑定 ownerId,服务端按 ownerId 过滤 Agent 列表,确保用户只能使用自己本地连接的 Agent,避免跨用户串操作。
- DevLoop 系统负责 AI 辅助开发全流程,包括需求澄清、任务拆分、开发实现、构建部署流水线、测试诊断等阶段。
## 2. 项目结构
```txt
ai-test/
public/ # 前端页面(需求管理、AI 测试、DevLoop、AI Data Agent 等工作台)
app.js # AI 测试工作台主流程与事件绑定
devloop.html # DevLoop 工作台页面
devloop.js # DevLoop 工作台主流程与事件绑定
devhistory.html # DevLoop 历史页面
devhistory.js # DevLoop 历史页面逻辑
devtask.html # DevLoop 任务页面
devtask.js # DevLoop 任务页面逻辑
js/
state.js # 前端共享状态、DOM 缓存、CLI 预设
api.js # API 请求与提示工具
script-review.js # 脚本审核、试跑、测试、优化
job-view.js # 执行任务列表、详情、调试面板
generation-status.js # 用例生成进度与自检结果渲染
case-selection.js # 用例批量选择、导入导出辅助
agent/ # Windows Node.js Agent(本地执行器)
src/
server.js # 服务启动入口与依赖装配
server/
app-services.js # 应用服务组装层,导出状态、任务、脚本、执行等服务能力
config.js # 路径、端口、默认模板、CLI 配置
routes.js # HTTP 路由编排、CORS、静态资源 fallback
controllers/
system-controller.js # 健康检查、版本、提示词配置、Skill、自检
agents-controller.js # Agent 注册、心跳、认领任务、日志与结果回传
requirements-controller.js # 需求、研发任务、研发批次
cases-controller.js # 用例、脚本生命周期、用例生成任务
executions-controller.js # 执行批次、停止、重跑、历史报告
user-cases-controller.js # 用户用例 Excel 导入导出
dev-loop-controller.js # DevLoop 核心控制器
services/
state-store.js # 本地状态、运行时任务 Map、ID/时间工具
prompt-service.js # 提示词配置与模板渲染
dev-job-service.js # 研发任务拆分与研发批次执行
script-service.js # 脚本状态、草稿/探测/优化提示词与解析
job-tracker-service.js # 异步生成/脚本任务的内存进度跟踪
case-generation-service.js # AI 用例生成主流程
execution-service.js # 用例执行编排、批次构建、Agent 任务载荷
execution-helper-service.js # 执行报告、执行提示词与 Playwright 计划辅助
network-service.js # Gemini / OpenCode / Playwright MCP 自检
sample-service.js # 样例导入、版本读取、需求/用例 Markdown 解析
user-case-import-service.js # 用户用例 Excel 导入辅助
common-utils.js # 通用文本与输出合并工具
dev-loop-service.js # DevLoop 核心服务
dev-loop-stage-handlers/ # DevLoop 阶段处理器
index.js # 阶段处理器入口
pipeline-handler.js # 构建部署流水线阶段处理器
develop-handler.js # 开发阶段处理器
diagnose-handler.js # 诊断阶段处理器
done-handler.js # 完成阶段处理器
fix-handler.js # 修复阶段处理器
review-handler.js # 评审阶段处理器
split-handler.js # 任务拆分阶段处理器
test-handler.js # 测试阶段处理器
default-handler.js # 默认阶段处理器
mock-tool-adapter.js # 调试模式工具适配器
http-utils.js # JSON / 文本响应与请求体解析
static-files.js # 静态资源服务
modules/
gemini.js # CLI 调用与报告解析
case-utils.js # 用例生成/解析/规范化工具
skill-pack.js # Skill Zip 上传、解析、执行引擎
report-docx.js # 历史汇总与 docx 构建
opencode-api.js # OpenCode API 调用
opencode-sdk.js # OpenCode SDK 封装
opencode-serve-manager.js # OpenCode Serve 管理
agent-browser-runner.js # Agent 浏览器运行器
playwright-executor.js # Playwright 执行器
playwright-script-runner.js # Playwright 脚本运行器
requirement-import.js # 需求导入工具
data/app.sqlite # SQLite 持久化数据(首次启动会从 data/db.json 迁移)
VERSION # 当前版本号(格式:v主版本-发布日期)
require.md # 样例需求文件
caseAll.md # 样例用例文件
docs/dev-loop-contract.md # DevLoop 契约文档
```
### 2.1 模块化边界
- `src/server.js` 只负责启动服务和组装依赖,避免继续堆叠路由细节。
- `src/server/app-services.js` 只负责组装 services,并统一导出给 controllers 使用。
- `src/server/routes.js` 负责统一 CORS、异常处理、controller 分发和静态资源 fallback。
- `src/server/controllers/*` 按业务领域承载 API 具体实现,主要负责请求解析和响应。
- `src/server/services/*` 承载状态、生成、脚本、执行、自检等服务逻辑,让控制器保持薄层。
- `src/server/config.js` 集中管理默认提示词模板、路径常量和 CLI 识别逻辑。
- `public/app.js` 保留 AI 测试工作台主流程;独立功能放入 `public/js/*`,按 `ai-test.html` 中的脚本顺序加载。
- `public/images/` 为需求内容中的运行时图片资源目录,默认不纳入 Git。
## 3. 环境要求
- Node.js 22.5+(当前存储层使用 Node 内置 `node:sqlite`)
- 已安装可用的 Gemini CLI(`gemini`)
- 如需使用 OpenCode Serve,请在本机启动服务并配置 `OPENCODE_SERVE_BASE_URL`
- 如需使用页面上的 OpenCode Serve 重启能力,可按需配置 `OPENCODE_SERVE_RESTART_COMMAND`;未配置时默认执行 `opencode serve --port `
- 如需使用 OpenCode Serve 执行浏览器类用例,还需要在 OpenCode 环境中安装并启用 `chrome-devtools` 的 MCP Server;否则模型可能无法打开浏览器,或报 `Tool execution denied by policy`
- macOS / Linux / Windows(仅命令略有差异)
### Windows 额外说明
- 命令建议使用双引号包裹 Prompt 占位符,例如:
- `MODEL_CLI_CMD=gemini --yolo -p "{{PROMPT}}"`
- Skill Zip 解压在 Windows 下会自动使用 PowerShell `Expand-Archive`,无需手工安装 `unzip`
- Skill 执行引擎支持 `python` / `python3` / `py` / `python.exe` / `py.exe`
- 若上传 Skill 出现 `spawn EPERM`:系统会自动回退 `powershell.exe -> pwsh.exe -> tar`,建议确认至少一种可执行
## 4. 安装与启动
### 4.1 安装服务端
在部署机器上安装依赖并启动 Web 服务:
```bash
cd /Users/xxxx/code/ai-test
npm install
npm run start
```
默认监听:
- `HOST=127.0.0.1`
- `PORT=8012`
如需修改端口:
```bash
HOST=127.0.0.1 PORT=8013 npm run start
```
服务启动成功后,默认 Web 根地址为 `http://127.0.0.1:8012/`。
如需生成不包含后端源码目录的运行入口,可在开发机执行:
```bash
npm run build:server
```
构建产物为 `dist/server.cjs`。目标机器运行时使用:
```bash
npm run start:dist
```
也可以一键生成发布用 Zip:
```bash
npm run package:release
```
输出文件为 `release/ai-engineering-copilot.zip`。该包不包含 `src/`、`scripts/`、`agent/` 和 `.git/`,解压后进入目录执行 `npm run start` 即可启动。
最小部署内容:
- `dist/server.cjs`
- `public/`
- `prompt-templates/dev-loop/`(DevLoop AI Prompt 模板,可直接编辑)
- `node_modules/`
- `package.json`
- `.env.local`(按环境配置)
- `data/`(用于 `app.sqlite`、执行产物和 Skill 包)
DevLoop Prompt 模板默认从 `prompt-templates/dev-loop/` 读取;如需放到其他目录,可通过 `DEV_LOOP_PROMPT_TEMPLATE_DIR` 指定。
### 4.2 服务端环境变量
建议在项目根目录创建 `.env.local`。服务启动时会自动加载 `.env.local` 与 `.env`。
```bash
MODEL_CLI_CMD=gemini --yolo -p {{PROMPT}}
# 兼容旧变量名(若已配置可继续使用)
GEMINI_CLI_CMD=gemini --yolo -p {{PROMPT}}
GENERATE_CASES_TIMEOUT_MS=600000
GENERATE_CASES_BATCH_SIZE=6
GENERATE_CASES_RETRY=4
GENERATE_CASES_RETRY_BASE_MS=3000
SKILL_RUNTIME_TIMEOUT_MS=60000
# 如需使用 OpenCode Serve
OPENCODE_SERVE_BASE_URL=http://127.0.0.1:4096
# 可选:自定义页面“重启 OpenCode Serve”按钮执行的命令
# OPENCODE_SERVE_RESTART_COMMAND=opencode serve --port 4096
# Playwright 浏览器启动优先级:
# 1) PLAYWRIGHT_EXECUTABLE_PATH
# 2) PLAYWRIGHT_BROWSER_CHANNEL
# 3) macOS 下自动尝试系统 Chrome / Chrome for Testing / Edge
# 4) Playwright bundled chromium
PLAYWRIGHT_BROWSER_CHANNEL=chrome
```
如果执行浏览器类任务时报错缺少 Playwright 浏览器,优先配置 `PLAYWRIGHT_EXECUTABLE_PATH` 或 `PLAYWRIGHT_BROWSER_CHANNEL=chrome`;如果没有系统浏览器,再执行 `npx playwright install chromium`。
### 4.3 推荐:用户本地 WebSocket Agent
推荐使用 WebSocket Agent 作为本地 AI 执行方式。它适合服务端部署在共享机器或内网机器上,但 AI CLI、浏览器、项目代码、账号和内部工具都在用户自己电脑上的场景。
WebSocket Agent 的特点:
- 由用户本机主动连接服务端,不需要服务端反向访问用户电脑。
- 连接时通过 Token 绑定 `ownerId`,服务端按用户隔离 Agent 列表。
- DevLoop 的开发、诊断、修复等阶段可以在用户本机调用 Gemini / OpenCode CLI。
#### 4.3.1 配置本地 Agent
在用户本机的项目根目录创建或更新 `.env.agent.local`:
```bash
AGENT_SERVER_BASE_URL=http://127.0.0.1:8012
AGENT_NAME=local-ws-agent-01
AGENT_WS_MODE=1
# 填服务端分配给当前用户的 Agent Token
AI_AGENT_WS_TOKEN=
# 本机实际可用的 AI CLI 命令
AGENT_MODEL_CLI_CMD=gemini --yolo -p "{{PROMPT}}"
```
Windows 示例:
```bash
AGENT_SERVER_BASE_URL=http://127.0.0.1:8012
AGENT_NAME=win-ws-agent-01
AGENT_WS_MODE=1
AI_AGENT_WS_TOKEN=
AGENT_MODEL_CLI_CMD=C:\\path\\to\\gemini.exe --yolo -p "{{PROMPT}}"
```
配置文件也可以放在 `agent/.env.agent.local`。Agent 启动时会优先读取 `agent/` 目录下的配置,再读取项目根目录配置。
#### 4.3.2 启动 WebSocket Agent
在用户本机执行:
```bash
npm run start:agent:ws
```
连接成功后可以看到:
- Agent 终端打印 `[agent-ws] connected`
- `GET /api/ai-ws-agents` 返回当前用户的在线 Agent
#### 4.3.3 启动排查
- 终端没有出现 `[agent-ws] connected`:检查 `AGENT_SERVER_BASE_URL` 是否指向服务端地址。
- 401 或反复断开:检查 `AI_AGENT_WS_TOKEN` 是否正确。
- AI 命令找不到:显式配置 `AGENT_MODEL_CLI_CMD`,不要依赖不确定的 PATH。
- Windows 上误用 `@wizard/gemini`:把 `AGENT_MODEL_CLI_CMD` 指向明确的 `gemini.exe` 路径。
相关接口:
- WebSocket:`/ws/ai-agent`
- 在线 Agent 列表:`GET /api/ai-ws-agents`
### 4.4 兼容:轮询 Windows Agent
轮询 Agent 是较早的本地执行方式。新接入 DevLoop 时优先安装和启动 WebSocket Agent。
启动方式:
```bash
npm run start:agent
```
Windows 也可以直接双击:
```bat
agent\start-agent.bat
```
轮询 Agent 的 `.env.agent.local` 示例:
```bash
AGENT_SERVER_BASE_URL=http://127.0.0.1:8012
AGENT_NAME=win-agent-01
AGENT_POLL_INTERVAL_MS=3000
AGENT_HEARTBEAT_INTERVAL_MS=10000
AGENT_MODEL_CLI_CMD=C:\\path\\to\\gemini.exe --yolo -p "{{PROMPT}}"
# 兼容旧变量名(若已配置可继续使用)
AGENT_GEMINI_CLI_CMD=C:\\path\\to\\gemini.exe --yolo -p "{{PROMPT}}"
```
说明:
- `AGENT_MODEL_CLI_CMD` 优先级高于服务端下发的 `geminiCommand`。
- Agent 本地产物目录为 `agent-data/artifacts///`。
相关接口:
- `GET /api/agents`
- `POST /api/agents/register`
- `POST /api/agents/:agentId/heartbeat`
- `POST /api/agents/:agentId/claim-next`
- `POST /api/agents/:agentId/jobs/:jobId/tasks/:taskId/logs`
- `POST /api/agents/:agentId/jobs/:jobId/tasks/:taskId/result`
## 5. 使用流程(推荐)
### 5.1 AI 测试用例使用指导
AI 测试工作台面向“录入需求 -> AI 生成测试用例 -> AI 执行用例 -> 查看报告”的自动测试流程。推荐入口为:
```text
http://127.0.0.1:8012/ai-test.html
```
#### 5.1.1 准备执行环境
开始执行用例前,先确认模型执行方式已经可用:
1. 服务端本机执行
- 适合服务端机器可以直接访问被测系统、浏览器、账号和网络环境的场景。
- 可使用 Gemini CLI 或 OpenCode Serve。
- 如果使用 OpenCode Serve,请确认 `OPENCODE_SERVE_BASE_URL` 已配置并可访问。
2. Windows Agent 执行
- 适合被测系统只能在 Windows 桌面、本地浏览器或内网环境访问的场景。
- 在 Windows 机器上启动轮询 Agent:
```bash
npm run start:agent
```
- 建议在 `.env.agent.local` 中显式配置 `AGENT_MODEL_CLI_CMD`,避免 Agent 误用错误的模型 CLI。
3. 执行模式选择
- `gemini` / `opencode`:由服务端直接调用 AI CLI 执行用例。
- `agent-gemini` / `agent-stepwise`:由 Windows Agent 在本机调用 AI CLI 执行用例。
- `agent-script`:执行已审核通过或已固化的 Playwright 脚本,适合高频回归,不是首次执行的主路径。
#### 5.1.2 新增需求并生成用例
在 AI 测试工作台中新增需求,填写业务背景、入口页面、账号信息、验收点和需要覆盖的测试范围。
也可以直接调用接口创建需求:
- `POST /api/requirements`
如果需求来自文档,可以先打开需求池页面上传文件:
```text
http://127.0.0.1:8012/requirement.html
```
上传入口支持 `.md`、`.txt`、`.docx`、`.xlsx` 和文本型 `.pdf`。系统会把文件转换成 Markdown,并回填到“新增需求”弹窗,人工确认后再保存入库。当前暂不支持 `.doc` 和 `.xls`。
创建需求后,点击“AI 生成用例”。系统会创建异步任务,让 AI 根据需求内容生成结构化测试用例。
- `POST /api/cases/generate/start`
- `GET /api/cases/generate/jobs/:id`
生成规则:
- 生成数量会根据需求复杂度自动估算。
- 同一需求再次生成时,会覆盖该需求下旧的 AI 用例。
- 生成默认超时为 10 分钟,可通过 `GENERATE_CASES_TIMEOUT_MS` 调整。
- 生成后的用例可以在页面弹窗中人工编辑、补充或删除。
#### 5.1.3 选择用例并启动 AI 执行
在“用例管理”中勾选要执行的用例,然后点击执行。核心链路是:系统把用例整理成执行任务和提示词,交给 Gemini、OpenCode 或 Windows Agent,由 AI 按用例步骤真实操作被测系统并返回结果。
执行接口:
- `POST /api/executions`
执行前建议确认:
- 选中的用例不是样例导入用例,样例用例默认不允许执行。
- AI 执行机器可以访问被测系统。
- 登录账号、验证码处理方式、测试数据准备方式已经写在需求或用例中。
- 如果需要浏览器操作,执行机器已具备可用浏览器环境。
- 如果选择 Windows Agent,Agent 列表里能看到在线 Agent。
执行说明:
- 执行时可选择主技能包,不选择也可以执行。
- 执行默认超时为 20 分钟。
- 执行区默认开启“快速执行模式”。
- 执行阶段不再依赖页面填写“被测系统基础地址”,AI 会从需求和用例上下文中读取入口信息。
- 任务详情中可以查看单条用例的执行提示词、AI 原始返回、日志和结果。
- 执行线程池面板仅展示最近 2 次任务,完整记录请到历史页面查看。
#### 5.1.4 查看执行结果
启动执行后,可在执行列表查看批次状态和单条用例结果:
- `GET /api/executions`
- `GET /api/executions/:id`
- `GET /api/executions/:id/report`
重点查看:
- 执行状态:成功、失败、超时、异常中断。
- AI 原始返回:用于判断失败是业务缺陷、环境问题、账号问题还是提示词理解偏差。
- 单条用例日志:用于追踪 AI 实际执行到哪一步。
- 截图、附件或产物:用于人工复核失败现场。
#### 5.1.5 历史批次与报告导出
历史页面用于追踪完整执行记录,并导出 `.docx` 汇总报告。
- `GET /api/executions/history`
- `POST /api/executions/history/report`
报告通常用于:
- 给产品、测试或研发同步本轮测试结论。
- 归档测试批次、失败原因和执行证据。
- 对比多轮执行中的稳定性变化。
#### 5.1.6 可选:脚本化回归
页面探测、生成脚本草稿和脚本审核是辅助能力,适合把已经稳定的 AI 执行路径沉淀成可复用脚本。首次验证需求时,建议优先使用 AI 直接执行用例。
可选接口:
- `GET /api/cases/:id/script`
- `POST /api/cases/:id/script/probe`
- `POST /api/cases/:id/script/generate`
- `PUT /api/cases/:id/script/draft`
- `POST /api/cases/:id/script/approve`
脚本审核通过后:
- 脚本会保存到用例的 `scriptApproved`。
- 若后续执行成功,会自动固化到 `scriptReusable`。
- 选择 `agent-script` 执行模式时,会优先执行已审核通过或已固化的 Playwright 脚本。
#### 5.1.7 常见排查
- AI 执行失败但业务看起来正常:先查看单条用例的 AI 原始返回,确认是否缺少账号、入口、测试数据或断言口径。
- Windows Agent 没有任务:确认 Agent 已启动、服务端地址正确,并且页面选择了 Agent 执行模式。
- Gemini / OpenCode 命令找不到:在服务端或 Agent 的环境变量中显式配置模型 CLI 命令。
- 浏览器无法打开被测系统:确认执行机器网络、代理、证书和登录态,而不是只检查服务端网络。
- 执行结果不稳定:补充更明确的前置条件、测试数据、页面入口和验收标准,再重新生成或编辑用例。
### 5.2 DevLoop 开发闭环使用指导
DevLoop 面向“从需求到开发、构建部署、测试、诊断、修复、验收”的完整闭环。推荐入口为:
```text
http://127.0.0.1:8012/devloop.html
```
#### 5.2.1 首次使用前配置
打开 DevLoop 工作台后,先进入“配置”面板完成这些设置:
1. 生成自动化 Token
- 点击“自动化 Token”区域的“一键生成 Token”。
- 该 Token 用于 WebSocket Agent 鉴权,也用于多用户隔离。
- 多人共用同一服务端时,每个人应使用自己的 Token。
2. 选择 AI 执行位置
- `服务端本机执行`:AI CLI 在启动 Node 服务的机器上执行。
- `用户本地 WebSocket Agent`:AI CLI 在用户自己的电脑上执行,适合访问本地代码、账号、浏览器和内部工具。
3. 配置 AI 引擎
- 当前支持 `Gemini` 和 `OpenCode Serve`。
- 开发、构建部署、诊断、修复阶段可分别配置 Skill 包和超时时间。
- 使用 OpenCode Serve 时,建议先确认 `OPENCODE_SERVE_BASE_URL` 可访问。
4. 启动本地 WebSocket Agent(可选)
如果选择“用户本地 WebSocket Agent”,在用户本机启动:
```bash
npm run start:agent:ws
```
`.env.agent.local` 示例:
```bash
AGENT_SERVER_BASE_URL=http://127.0.0.1:8012
AGENT_NAME=local-ws-agent-01
AGENT_WS_MODE=1
AI_AGENT_WS_TOKEN=
AGENT_MODEL_CLI_CMD=gemini --yolo -p "{{PROMPT}}"
```
连接成功后,配置页的“指定 Agent”下拉框会出现对应 `AGENT_NAME`。
#### 5.2.2 创建 DevLoop
在 DevLoop 工作台左侧选择需求后,填写:
- DevLoop 标题
- 项目路径:必须填写本机真实代码仓库路径
- Git/SVN 地址
- Git 分支名称
- 流水线地址
- 健康检查 URL
点击“创建 DevLoop”后,系统会创建一条独立闭环记录。后续阶段状态、产物、日志、反馈和回流原因都会保存到 `data/app.sqlite`。
#### 5.2.3 阶段流程
DevLoop 当前阶段顺序为:
```text
需求澄清 -> 任务拆分 -> 开发实现 -> 构建部署 -> 测试 -> 问题诊断 -> 修复 -> 验收评审 -> 完成
```
1. 需求澄清
- 点击“AI 需求诊断”。
- AI 会分析需求、生成验收标准,并识别歧义点。
- 如果出现澄清 Gate,先在页面回答问题,再继续诊断。
- 验收标准确认无误后,点击“确认需求澄清并进入任务拆分”。
2. 任务拆分
- 先点击“学习代码结构”,让 AI 读取项目结构并生成摘要。
- 再点击“AI 任务拆分”,生成开发任务。
- 人工确认任务后,点击“确认任务并进入开发”。
3. 开发实现
- 进入开发阶段后,系统会自动创建 AI 开发任务。
- 如果开发过程需要人工澄清,页面会显示输入框和提交按钮。
- 如果 AI 卡住或服务重启导致任务丢失,可使用“人工检查后继续推进”继续当前阶段。
- 使用 OpenCode Serve 时,系统会尽量复用 session;如果项目路径变更,会重启 Serve 并切换工作目录。
4. 构建部署
- 进入构建部署阶段后,AI 会基于仓库地址、分支、流水线地址和开发产物调用流水线。
- 如果配置了调试模式,可用 Mock 成功 / Mock 失败回流模拟阶段结果。
- 构建部署完成后,确认进入测试阶段。
5. 测试、诊断、修复
- 测试阶段可执行 AI 测试任务。
- 测试失败后进入问题诊断,AI 会结合测试报告、开发输出和流水线日志分析原因。
- 诊断确认后进入修复阶段,AI 根据诊断结论进行修复。
- 修复完成后进入验收评审。
6. 验收评审
- 页面提供“不通过原因”输入框,以及“回流”“验收通过”两个按钮。
- 点击“验收通过”:DevLoop 进入完成阶段。
- 点击“回流”:必须填写不通过原因,系统会回到开发实现阶段并自动启动 AI 开发。
- 回流提示词只包含本轮最新不通过原因,不会混入历史人工反馈,也不会把历史开发任务重新带入提示词。
#### 5.2.4 OpenCode Serve 工作目录规则
OpenCode Server API 当前不支持在创建 session 时直接传 `cwd`。因此系统采用以下策略:
- DevLoop 开发阶段会把“项目路径”传给 OpenCode 调用链。
- 调用前系统会查询 OpenCode Serve 的 `/path`。
- 如果当前 Serve 工作目录与 DevLoop 项目路径不一致,系统会重启 OpenCode Serve,并以项目路径作为启动工作目录。
- 重启输出和 AI 执行日志中会显示工作目录,用户可以确认实际目录。
注意:
- OpenCode Serve 是共享服务。同一台机器上多个 DevLoop 如果指向不同项目路径,系统可能会切换 Serve 工作目录。
- 工作目录切换后不会复用旧 session,避免旧 session 指向错误项目。
- Windows 下默认使用 `start /D <项目路径>` 启动可见的 OpenCode Serve 窗口。
#### 5.2.5 回流规则
阶段失败或人工验收不通过时,可回流到较早阶段。常见回流目标是 `develop`:
- 回流会生成 `stage_feedback` 产物。
- 回流会创建反馈处理任务。
- 回流到开发阶段后,系统会自动启动开发 AI。
- 验收评审回流只把本轮“不通过原因”传给开发 AI,避免历史反馈干扰。
#### 5.2.6 常见排查
- 配置页看不到 Agent:确认本地终端出现 `[agent-ws] connected`,并确认 `AI_AGENT_WS_TOKEN` 与页面 Token 一致。
- 提示没有可用 Agent:当前 Token 下没有在线 Agent,或指定 Agent 已离线。
- OpenCode 操作了错误目录:查看重启弹窗或 AI 日志中的“工作目录”,确认是否等于 DevLoop 项目路径。
- OpenCode 浏览器工具不可用:确认 OpenCode 环境已安装并启用 `chrome-devtools` MCP Server。
- Windows `npm install` 卡在 SQLite:当前版本使用 Node 22 内置 `node:sqlite`,请确认 Node.js `>=22.5.0`。
#### 5.2.7 相关接口
- `GET /api/dev-loops`
- `POST /api/dev-loops`
- `POST /api/dev-loops/:id/start`
- `POST /api/dev-loops/:id/stop`
- `GET /api/dev-loops/:id/stages/:stage/exit-check`
- `POST /api/dev-loops/:id/stages/:stage/approve`
- `POST /api/dev-loops/:id/stages/:stage/complete`
- `POST /api/dev-loops/:id/stages/clarify/ai-diagnose`
- `POST /api/dev-loops/:id/stages/split/learn-codebase`
- `POST /api/dev-loops/:id/stages/split/ai-split`
- `POST /api/dev-loops/:id/stages/develop/ai-develop`
- `POST /api/dev-loops/:id/stages/pipeline/pipeline-job`
- `POST /api/dev-loops/:id/stages/test/test-run`
- `POST /api/dev-loops/:id/stages/diagnose/diagnose-job`
- `POST /api/dev-loops/:id/stages/fix/fix-job`
- `POST /api/dev-loop-config/token`
- `GET /api/ai-ws-agents`
## 6. 模型引擎与模型说明
### 6.1 当前模型由谁决定
本项目不在后端写死模型名,模型由以下项共同决定:
- `MODEL_CLI_CMD` / `GEMINI_CLI_CMD`(仅 Gemini CLI)
- 页面里当前选择的“生成引擎 / 执行引擎”
- OpenCode Serve 则通过 `OPENCODE_SERVE_BASE_URL` 指向服务地址
例如:
```bash
MODEL_CLI_CMD=gemini --yolo -p {{PROMPT}}
```
Windows 推荐写法:
```bash
MODEL_CLI_CMD=gemini --yolo -p "{{PROMPT}}"
```
如果希望调整 Gemini 的 CLI 命令模板,推荐在页面:
- `提示词配置 -> Gemini 预设命令`
### 6.2 常见命令
```bash
gemini --yolo -p "请只输出OK"
# OpenCode Serve 建议使用页面内置网络自检进行验证
```
### 6.3 OpenCode Serve 额外说明
如果执行引擎选择 `OpenCode Serve`,除了启动 `OPENCODE_SERVE_BASE_URL` 对应的服务外,还建议确认以下两项:
- OpenCode 环境里已安装并启用 `chrome-devtools` MCP Server
- OpenCode 当前会话对浏览器相关工具有调用权限
如果缺少这部分能力,常见现象包括:
- 页面能发起请求,但浏览器没有被拉起
- 调试日志里出现 `Tool execution denied by policy`
- 模型反馈无法执行 `browser_navigate`、`browser_run_code` 等浏览器工具
建议:
- 先在 OpenCode 自己的环境里单独验证浏览器能力是否可用
- 再回到本系统,点击页面上的“网络自检”确认 OpenCode Serve 可联通
#### OpenCode Serve 重启
执行线程池面板提供两类 OpenCode Serve 重启能力:
- 手动重启:点击“重启 OpenCode Serve”按钮,会先查找并停止当前机器上的 OpenCode Serve 进程,再重新启动服务。
- 自动重启:在“OpenCode每 N 个任务重启”中填写大于 `0` 的数字后,执行批次每完成 N 个 OpenCode 任务,且后面仍有待执行任务时,会先重启 OpenCode Serve,再继续后续任务。
默认值为 `0`,表示不自动重启。该配置只对执行引擎为 `OpenCode Serve` 的任务生效,Gemini 执行不受影响。
进程查找方式:
- Windows:按命令行匹配 `opencode` + `serve`,并按 `OPENCODE_SERVE_BASE_URL` 端口查找监听进程。
- macOS / Linux:按 `lsof -ti tcp:` 查找监听进程,并按 `pgrep -f "opencode.*serve"` 查找命令进程。
默认启动命令:
```bash
opencode serve --port 4096
```
如果本机启动 OpenCode Serve 需要额外参数,建议使用自定义重启命令:
```bash
OPENCODE_SERVE_BASE_URL=http://127.0.0.1:4096
OPENCODE_SERVE_RESTART_COMMAND="opencode serve --port 4096"
```
Windows Agent 本地执行 OpenCode 任务时,也会接收页面上的自动重启配置,并在 Agent 所在机器上执行同样的重启逻辑。
- 如果是新环境,优先补齐 `chrome-devtools` MCP,再做用例执行验证
当前版本的 OpenCode 调试体验已做两层增强:
- 执行调试信息中会展示会话创建、请求发送、流式通道建立等阶段性提示
- 系统会尝试结合 OpenCode 的全局事件流和 `session/:id/message` 轮询,补抓当前会话的过程消息
因此在 OpenCode 执行用例时,调试面板里通常可以看到:
- 当前会话 `sessionId`
- 工具调用前后事件
- 权限请求事件
- 会话消息中的增量文本片段
如果仍然只能看到等待提示,通常说明当前这轮 OpenCode Serve 没有暴露出更多可读的中间文本,而不是系统前端卡死。
### 6.4 遇到 `daily quota exhausted`
报错示例:`TerminalQuotaError: You have exhausted your daily quota on this model.`
处理建议:
- 切换模型(可能立即恢复)
- 检查是否账号/项目总配额已耗尽
- 等待次日配额重置或提升配额
## 7. Skill 包说明
系统支持两类 Skill 包来源:
1. 本地 Skill 包:放在 `data/skill-packs//SKILL.md`
2. 上传 Skill Zip:上传后会解压到 `data/skill-packs//content/SKILL.md`
推荐优先使用本地目录结构,便于人工维护和版本管理:
```text
data/skill-packs/
main-web-test/
SKILL.md
login/
SKILL.md
excel-import/
SKILL.md
```
注意:`data/skill-packs/SKILL.md` 不会被识别为技能包。系统只扫描 `data/skill-packs` 下的一级子目录,每个子目录内需要有 `SKILL.md`。
当前行为:
- 打开页面或调用 `GET /api/skills` 时,会主动扫描 `data/skill-packs`
- 生成用例时,可选择一个主技能,并将主技能文本规则注入到模型提示词
- 执行用例时,可选择一个主技能;若选择,则将主技能规则注入到执行提示词
- 主技能可以在 `SKILL.md` 中说明何时使用同目录库下的其他辅助技能
- 系统会把可用辅助技能清单作为白名单索引注入提示词,AI 只能读取清单中列出的 `skill-packs` 路径
- 当前主流程不会执行 `RUN:` / `READ:` 指令,也不会把 Skill 运行结果注入执行提示词
依赖文件注入规则:
- 会解析 `SKILL.md` 中的反引号路径和 Markdown 链接
- 仅注入 Skill 包目录内的 `.md`、`.txt`、`.json`、`.yaml`、`.yml` 文件内容
示例主技能:
```md
# Main Web Test
生成或执行登录相关测试时,参考 login 技能。
生成或执行 Excel 导入测试时,参考 excel-import 技能。
生成或执行权限校验测试时,参考 permission 技能。
```
## 8. 网络自检
接口:
- `GET /api/gemini/network-check`
- `GET /api/opencode/network-check`
- `POST /api/opencode/restart`
会检查:
- 网络环境变量(`HTTPS_PROXY` / `HTTP_PROXY` / `ALL_PROXY` / `NO_PROXY`)
- CLI 真实调用
## 9. API 一览
- `GET /api/health`
- `GET /api/version`
- `GET /api/prompt-config`
- `POST /api/sample/import`
- `GET /api/skills`
- `POST /api/skills/upload`
- `GET /api/gemini/network-check`
- `GET /api/opencode/network-check`
- `POST /api/opencode/restart`
- `GET /api/requirements`
- `POST /api/requirements`
- `POST /api/requirements/parse-document`(上传需求文件并解析为 Markdown)
- `DELETE /api/requirements/:id`
- `GET /api/cases`
- `POST /api/cases`
- `PUT /api/cases/:id`
- `DELETE /api/cases/:id`
- `GET /api/cases/:id/script`
- `POST /api/cases/:id/script/generate`
- `POST /api/cases/:id/script/probe`
- `PUT /api/cases/:id/script/draft`
- `POST /api/cases/:id/script/approve`
- `POST /api/cases/generate`
- `POST /api/cases/generate/start`
- `GET /api/cases/generate/jobs/:id`
- `GET /api/executions`
- `POST /api/executions`
- `GET /api/executions/:id`
- `GET /api/executions/:id/report`
- `GET /api/executions/history`
- `POST /api/executions/history/report`
### 9.1 DevLoop API
- `GET /api/dev-loops`(获取 DevLoop 列表)
- `POST /api/dev-loops`(创建 DevLoop)
- `POST /api/dev-loops/bulk-delete`(批量删除 DevLoop)
- `GET /api/dev-loops/:id`(获取 DevLoop 详情)
- `POST /api/dev-loops/:id/start`(启动 DevLoop)
- `POST /api/dev-loops/:id/stop`(停止 DevLoop)
- `POST /api/dev-loops/:id/clarify`(生成验收标准)
- `POST /api/dev-loops/:id/next`(推进到下一阶段)
- `POST /api/dev-loops/:id/approve-tasks`(确认开发任务)
- `GET /api/dev-loops/:id/stages/:stage/exit-check`(检查阶段出口条件)
- `POST /api/dev-loops/:id/stages/:stage/approve`(确认阶段完成)
- `POST /api/dev-loops/:id/stages/:stage/complete`(完成阶段)
- `POST /api/dev-loops/:id/stages/clarify/ai-diagnose`(AI 需求诊断)
- `GET /api/dev-loops/:id/stages/clarify/ai-diagnose/:jobId`(获取诊断任务进度)
- `POST /api/dev-loops/:id/stages/split/learn-codebase`(学习代码结构)
- `GET /api/dev-loops/:id/stages/split/learn-codebase/:jobId`(获取代码学习任务进度)
- `POST /api/dev-loops/:id/stages/split/ai-split`(AI 任务拆分)
- `GET /api/dev-loops/:id/stages/split/ai-split/:jobId`(获取任务拆分进度)
- `POST /api/dev-loops/:id/gates/:gateId/resolve`(处理 Gate)
- `GET /api/dev-loop-config`(获取 DevLoop 配置)
- `PUT /api/dev-loop-config`(更新 DevLoop 配置,包含开发、构建部署、诊断、修复阶段 AI 配置)
- `POST /api/dev-loop-config/token`(生成自动化回调 Token)
## 10. 说明
- 数据默认保存在 `data/app.sqlite`;首次启动会自动从旧的 `data/db.json` 迁移
- 版本号保存在项目根目录 `VERSION` 文件中
- 版本号规则:`v主版本-发布日期`,例如 `v1.0.0-20260402`
- 每次提交前请先更新 `VERSION` 文件
- 导出的历史汇总为标准 `.docx` 文件
- 若你在同一机器跑多个实例,请确认端口不要冲突
## 11. 开发验证
重构或新增模块后,建议至少执行:
```bash
node --check src/server.js
node --check src/server/app-services.js
node --check src/server/config.js
node --check src/server/routes.js
node --check src/server/http-utils.js
node --check src/server/static-files.js
for f in src/server/controllers/*.js; do node --check "$f" || exit 1; done
for f in src/server/services/*.js; do node --check "$f" || exit 1; done
for f in src/server/services/dev-loop-stage-handlers/*.js; do node --check "$f" || exit 1; done
for f in src/modules/*.js; do node --check "$f" || exit 1; done
for f in public/app.js public/js/*.js public/devloop.js public/devhistory.js public/devtask.js; do node --check "$f" || exit 1; done
```
启动服务后可做基础冒烟:
```bash
HOST=127.0.0.1 PORT=8012 npm run start
curl -sS http://127.0.0.1:8012/api/health
curl -sS http://127.0.0.1:8012/api/version
curl -sS http://127.0.0.1:8012/ai-test.html
curl -sS http://127.0.0.1:8012/devloop.html
```