refactor: 重构为单向生成架构,CLI 零参数可用
- 迁移 examples/rules/ 到 src/rules/,resources/devices.json 到 src/devices.json
- 迁移 resources/fetch-devlist.js 到 src/tools/fetch-devlist.ts 并改造为 ESM
- CLI 简化为零参数:bun run pack 自动编译并输出 dist/miot_{timestamp}.bak
- 移除备份合并能力:删除 mergeCompiledRules、RuleReplaceStrategy、dry-run、replace 参数
- 编译器简化为从零生成,不再支持 baseBackup 合并
- 新增 fetch-devices 命令用于从中枢网关更新设备清单
- 新增 bn.js、elliptic 依赖
- 更新测试路径引用,移除依赖合并逻辑的测试用例
- 更新 README.md 反映新项目结构和命令
This commit is contained in:
22
openspec/specs/fetch-devices-tool/spec.md
Normal file
22
openspec/specs/fetch-devices-tool/spec.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# Capability: Fetch Devices Tool
|
||||
|
||||
## Purpose
|
||||
|
||||
Provide a standalone CLI tool to fetch device lists from a Mi Home central hub gateway via ECJPAKE-encrypted WebSocket connection and write the result to `src/devices.json`.
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement: 设备清单抓取工具
|
||||
系统 SHALL 提供独立的 CLI 工具,通过 ECJPAKE 加密连接中枢网关 WebSocket 接口,调用 `getDevList` API 获取设备清单,并将结果直接写入 `src/devices.json`。
|
||||
|
||||
#### Scenario: 通过 IP 和 passcode 抓取设备
|
||||
- **WHEN** 用户执行 `bun run fetch-devices <ip> <passcode>` 命令
|
||||
- **THEN** 系统 SHALL 连接 `ws://<ip>/centrallinkws/`,完成 ECJPAKE 密钥协商和加密通道建立,调用 `getDevList` API,将结果以 `{ fetchedAt, url, count, devList }` 格式写入 `src/devices.json`
|
||||
|
||||
#### Scenario: passcode 格式校验
|
||||
- **WHEN** 用户输入的 passcode 不是 6 位数字
|
||||
- **THEN** 系统 SHALL 报错并退出,不写入文件
|
||||
|
||||
#### Scenario: 连接失败处理
|
||||
- **WHEN** 网关连接超时或 WebSocket 连接失败
|
||||
- **THEN** 系统 SHALL 报错并退出,不写入文件,不修改已有的 `src/devices.json`
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## Purpose
|
||||
|
||||
Allow users to author 米家极客版 (Mi Home Geek Edition) workflow rules using TypeScript files and a builder API, compile them into backup JSON, and package them as `.bak` files — with validation diagnostics and conservative merge semantics.
|
||||
Allow users to author 米家极客版 (Mi Home Geek Edition) workflow rules using TypeScript files and a builder API, compile them into backup JSON, and package them as `.bak` files — with validation diagnostics.
|
||||
|
||||
## Requirements
|
||||
|
||||
@@ -74,7 +74,7 @@ Allow users to author 米家极客版 (Mi Home Geek Edition) workflow rules usin
|
||||
- **THEN** 每条输出连接 SHALL 使用 `targetNodeId.targetPortName` 字符串格式,并指向存在的节点输入端口
|
||||
|
||||
### Requirement: 备份文件打包输出
|
||||
系统 SHALL 使用已知文件外壳将生成的备份 JSON 打包为米家极客版 `.bak` 文件。
|
||||
系统 SHALL 使用已知文件外壳将生成的备份 JSON 打包为米家极客版 `.bak` 文件,CLI 不需要任何参数即可完成全流程。
|
||||
|
||||
#### Scenario: 备份文件编码
|
||||
- **WHEN** 系统写出备份文件
|
||||
@@ -84,28 +84,10 @@ Allow users to author 米家极客版 (Mi Home Geek Edition) workflow rules usin
|
||||
- **WHEN** 系统解包一个已生成的备份文件
|
||||
- **THEN** 解包得到的 JSON SHALL 与压缩前的编译结果 JSON 一致
|
||||
|
||||
### Requirement: 保守备份合并
|
||||
系统 SHALL 默认保留现有备份内容,只新增或显式替换用户选择的工作流规则。
|
||||
#### Scenario: 零参数 CLI 编译
|
||||
- **WHEN** 用户执行 `bun run pack` 且不传入任何参数
|
||||
- **THEN** 系统 SHALL 自动从 `src/rules/index.ts` 加载规则定义,从 `src/devices.json` 加载设备清单,从零编译生成备份,并写入 `dist/miot_{timestamp}.bak`
|
||||
|
||||
#### Scenario: 追加生成规则
|
||||
- **WHEN** 用户基于现有备份编译新规则且未指定替换策略
|
||||
- **THEN** 系统 SHALL 保留所有已有规则,并追加生成的规则
|
||||
|
||||
#### Scenario: 按显式身份替换规则
|
||||
- **WHEN** 用户指定生成规则按 ID 或唯一名称替换已有规则
|
||||
- **THEN** 系统 SHALL 只替换匹配规则,并保持无关规则不变
|
||||
|
||||
### Requirement: 校验诊断
|
||||
系统 SHALL 在写出最终 `.bak` 前校验生成的工作流,并为无效结构报告可操作的诊断信息。
|
||||
|
||||
#### Scenario: 非法节点 ID
|
||||
- **WHEN** 生成或用户指定的节点 ID 包含 `0-9a-zA-Z` 之外的字符
|
||||
- **THEN** 校验 MUST 失败,并给出能定位非法节点的诊断信息
|
||||
|
||||
#### Scenario: 非法连接目标
|
||||
- **WHEN** 生成连接指向不存在的节点或不存在的输入端口
|
||||
- **THEN** 校验 MUST 失败,并给出能定位非法连接的诊断信息
|
||||
|
||||
#### Scenario: 设备资源中不存在的设备
|
||||
- **WHEN** 工作流引用的 `did` 不存在于配置的 `devices.json` 资源中
|
||||
- **THEN** 校验 MUST 根据所选严格模式失败或警告,且诊断信息 SHALL 包含缺失的 `did`
|
||||
#### Scenario: 输出文件命名
|
||||
- **WHEN** 系统写出备份文件
|
||||
- **THEN** 文件名 SHALL 使用 `miot_{yyyyMMdd_HHmmss}.bak` 格式,位于 `dist/` 目录下
|
||||
|
||||
Reference in New Issue
Block a user