Files
agent-aide/aide-program/docs/commands/decide/verification.md

529 lines
9.3 KiB
Markdown
Raw Normal View History

# 验证清单(实现完成后的自检)
本清单用于在实现 `aide decide` 后进行验证,确保行为符合设计文档与 plugin 契约。
## 一、准备条件
- 已执行 `aide init`,确保 `.aide/` 目录存在
- 准备测试用的 JSON 数据(见附录)
- 确保端口 3721 未被占用(或准备测试端口探测)
## 二、CLI 用例
### 2.1 正常提交待定项
**步骤**
1. 执行 `aide decide '<valid_json>'`
**期望**
- 输出包含 `→ Web 服务已启动`
- 输出包含 `→ 请访问: http://localhost:3721`(或其他端口)
- 输出包含 `→ 等待用户完成决策...`
- `.aide/decisions/pending.json` 被创建
- 服务阻塞等待
### 2.2 JSON 解析失败
**步骤**
1. 执行 `aide decide 'invalid json'`
**期望**
- 输出 `✗ JSON 解析失败: ...`
- 退出码为 1
- 不创建 pending.json
- 不启动服务
### 2.3 数据验证失败
**步骤**
1. 执行 `aide decide '{"task":"test"}'`(缺少必填字段)
**期望**
- 输出 `✗ 数据验证失败: ...`
- 错误信息明确指出缺少的字段
- 退出码为 1
### 2.4 获取决策结果(无数据)
**步骤**
1. 确保 `.aide/decisions/` 为空
2. 执行 `aide decide result`
**期望**
- 输出 `✗ 未找到待定项数据`
- 退出码为 1
### 2.5 获取决策结果(有 pending 无 result
**步骤**
1. 执行 `aide decide '<json>'` 并立即中断Ctrl+C
2. 执行 `aide decide result`
**期望**
- 输出 `✗ 尚无决策结果`
- 退出码为 1
### 2.6 获取决策结果(正常)
**步骤**
1. 完成一次完整的决策流程
2. 执行 `aide decide result`
**期望**
- 输出 JSON 格式的决策结果
- JSON 可被正确解析
- 包含所有待定项的决策
- 退出码为 0
## 三、HTTP 服务用例
### 3.1 端口探测
**步骤**
1. 占用端口 3721`nc -l 3721`
2. 执行 `aide decide '<json>'`
**期望**
- 服务在 3722 端口启动
- 输出显示正确的端口号
### 3.2 端口全部被占用
**步骤**
1. 占用端口 3721-3730
2. 执行 `aide decide '<json>'`
**期望**
- 输出 `✗ 无法启动服务: 端口 3721-3730 均被占用`
- 退出码为 1
### 3.3 GET /api/items
**步骤**
1. 启动服务
2. 使用 curl 访问 `http://localhost:3721/api/items`
**期望**
- 返回 200 状态码
- Content-Type 为 `application/json`
- 返回的 JSON 与 pending.json 内容一致
### 3.4 POST /api/submit正常
**步骤**
1. 启动服务
2. 使用 curl 提交决策:
```bash
curl -X POST http://localhost:3721/api/submit \
-H "Content-Type: application/json" \
-d '{"decisions":[{"id":1,"chosen":"jwt"}]}'
```
**期望**
- 返回 200 状态码
- 返回 `{"success":true,"message":"决策已保存"}`
- 服务关闭
- 历史记录文件被创建
### 3.5 POST /api/submit数据不完整
**步骤**
1. 启动服务(待定项有 2 个)
2. 提交只包含 1 个决策的数据
**期望**
- 返回 400 状态码
- 返回错误信息指出缺少的决策
- 服务不关闭
### 3.6 静态资源服务
**步骤**
1. 启动服务
2. 访问 `http://localhost:3721/`
3. 访问 `http://localhost:3721/style.css`
4. 访问 `http://localhost:3721/app.js`
**期望**
- 所有资源返回 200 状态码
- Content-Type 正确
- 内容非空
### 3.7 404 处理
**步骤**
1. 启动服务
2. 访问 `http://localhost:3721/nonexistent`
**期望**
- 返回 404 状态码
### 3.8 服务中断Ctrl+C
**步骤**
1. 启动服务
2. 按 Ctrl+C
**期望**
- 服务正常关闭
- 无异常输出
- 退出码为 0 或 130SIGINT
## 四、Web 前端用例
### 4.1 页面加载
**步骤**
1. 启动服务
2. 在浏览器中打开页面
**期望**
- 页面正常渲染
- 显示任务名称和来源
- 显示所有待定项
- 提交按钮为禁用状态
### 4.2 选项选择
**步骤**
1. 点击某个选项
**期望**
- 选项被选中(视觉反馈)
- 进度更新(如 "已完成 1/2 项"
- 若所有项已选择,提交按钮启用
### 4.3 推荐选项显示
**步骤**
1. 提交包含 recommend 字段的数据
2. 查看页面
**期望**
- 推荐选项有特殊标记
- 卡片头部显示推荐信息
### 4.4 备注输入
**步骤**
1. 在备注框中输入文字
2. 提交决策
3. 查看决策结果
**期望**
- 备注内容被保存
- 决策结果中包含 note 字段
### 4.5 提交决策
**步骤**
1. 选择所有待定项的选项
2. 点击提交按钮
**期望**
- 显示提交中状态
- 提交成功后显示成功提示
- 页面提示可以关闭
### 4.6 提交失败处理
**步骤**
1. 模拟服务端错误(如断开网络)
2. 点击提交按钮
**期望**
- 显示错误提示
- 提交按钮恢复可用
- 可以重试
### 4.7 浏览器兼容性
**步骤**
1. 在 Chrome、Firefox、Safari、Edge 中分别测试
**期望**
- 页面正常渲染
- 交互功能正常
- 无 JavaScript 错误
## 五、数据存储用例
### 5.1 pending.json 创建
**步骤**
1. 执行 `aide decide '<json>'`
2. 检查 `.aide/decisions/pending.json`
**期望**
- 文件存在
- JSON 格式正确
- 包含 `_meta` 字段
- `_meta.session_id` 格式正确
### 5.2 历史记录创建
**步骤**
1. 完成一次决策流程
2. 检查 `.aide/decisions/` 目录
**期望**
- 存在 `{session_id}.json` 文件
- 文件包含 input、output、completed_at 字段
- session_id 与 pending.json 中的一致
### 5.3 pending.json 覆盖
**步骤**
1. 执行 `aide decide '<json1>'`
2. 中断服务
3. 执行 `aide decide '<json2>'`
4. 检查 pending.json
**期望**
- pending.json 内容为 json2
- session_id 已更新
### 5.4 原子写入验证
**步骤**
1. 在写入过程中模拟中断
2. 检查文件状态
**期望**
- 文件要么是完整的旧内容,要么是完整的新内容
- 不会出现部分写入的损坏状态
## 六、端到端用例
### 6.1 完整流程
**步骤**
1. 执行 `aide decide '<json>'`
2. 在浏览器中打开链接
3. 选择所有选项
4. 添加备注
5. 点击提交
6. 执行 `aide decide result`
**期望**
- 整个流程无错误
- 决策结果正确反映用户选择
- 备注内容正确保存
### 6.2 与 /aide:prep 集成
**步骤**
1. 模拟 LLM 调用流程
2. 构造待定项 JSON
3. 调用 aide decide
4. 完成决策
5. 获取结果
**期望**
- 流程符合 plugin 契约
- 输出格式便于 LLM 解析
## 七、异常用例
### 7.1 .aide 目录不存在
**步骤**
1. 删除 .aide 目录
2. 执行 `aide decide '<json>'`
**期望**
- 输出 `✗ .aide 目录不存在,请先执行 aide init`
- 退出码为 1
### 7.2 pending.json 损坏
**步骤**
1. 手动写入无效 JSON 到 pending.json
2. 执行 `aide decide result`
**期望**
- 输出解析错误信息
- 建议重新执行 aide decide
### 7.3 超大 JSON 数据
**步骤**
1. 构造包含 100 个待定项的 JSON
2. 执行 `aide decide '<json>'`
**期望**
- 正常处理或给出合理的限制提示
- 不会导致内存溢出或崩溃
### 7.4 特殊字符处理
**步骤**
1. 在 task、title、note 中包含特殊字符中文、emoji、引号、换行
2. 完成决策流程
**期望**
- 特殊字符正确保存和显示
- 不会导致 JSON 解析错误
## 八、附录:测试数据
### 8.1 最小有效数据
```json
{
"task": "测试任务",
"source": "test.md",
"items": [
{
"id": 1,
"title": "测试问题",
"options": [
{"value": "a", "label": "选项A"},
{"value": "b", "label": "选项B"}
]
}
]
}
```
### 8.2 完整数据
```json
{
"task": "实现用户认证模块",
"source": "task-now.md",
"items": [
{
"id": 1,
"title": "认证方式选择",
"location": {
"file": "task-now.md",
"start": 5,
"end": 7
},
"context": "任务描述中未明确指定认证方式,需要确认",
"options": [
{
"value": "jwt",
"label": "JWT Token 认证",
"score": 85,
"pros": ["无状态", "易于扩展", "跨域友好"],
"cons": ["Token 无法主动失效", "需要处理刷新"]
},
{
"value": "session",
"label": "Session 认证",
"score": 70,
"pros": ["实现简单", "可主动失效"],
"cons": ["需要存储", "扩展性差"]
}
],
"recommend": "jwt"
},
{
"id": 2,
"title": "密码加密算法",
"context": "选择密码存储的加密算法",
"options": [
{
"value": "bcrypt",
"label": "bcrypt",
"score": 90,
"pros": ["安全性高", "自带盐值"],
"cons": ["计算较慢"]
},
{
"value": "argon2",
"label": "Argon2",
"score": 95,
"pros": ["最新标准", "抗GPU攻击"],
"cons": ["库支持较少"]
}
],
"recommend": "bcrypt"
}
]
}
```
### 8.3 期望的决策结果
```json
{
"decisions": [
{"id": 1, "chosen": "jwt"},
{"id": 2, "chosen": "bcrypt", "note": "团队更熟悉 bcrypt"}
]
}
```
## 九、相关文档
- [decide 详细设计入口](README.md)
- [CLI 规格](cli.md)
- [HTTP 服务设计](server.md)
- [Web 前端设计](web.md)
- [数据存储设计](storage.md)