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:
2026-05-08 00:03:27 +08:00
parent 690ef8ce83
commit 63dc55fa5a
15 changed files with 2133 additions and 243 deletions

View File

@@ -1,11 +1,9 @@
# miot_x
`miot_x` 是一个基于 Bun + TypeScript 的米家极客版工作流编排实验项目。目标是用 TypeScript 代码描述简单工作流,再编译、校验并打包成米家极客版可导入的 `.bak` 备份文件。
`miot_x` 是一个基于 Bun + TypeScript 的米家极客版工作流编排项目。用 TypeScript 代码描述工作流规则,编译并打包成米家极客版可导入的 `.bak` 备份文件。
## 当前范围
第一版只验证“编程化开发工作流”的可行性,不做纯文本 DSL也不做完整 MIoT 元数据智能解析。
当前支持:
- 设备属性触发和事件触发,生成 `deviceInput`
@@ -15,34 +13,38 @@
- 简单逻辑组合,生成 `logicAnd``logicOr``logicNot`
- 延时动作,生成 `delay`
- 注释节点,生成 `nop`
- `.bak` 解包、打包、合并和校验
- `.bak` 解包、打包和校验
- 从中枢网关抓取设备清单
当前不支持:
- 纯文本 DSL 或自定义 parser
- 中文能力名自动匹配,例如 `light.power.on()`
- 主动连接中枢网关或复现 websocket 会话
- 自动删除旧规则、旧变量或自动清理孤儿变量
- 完整覆盖米家极客版所有节点类型
## 项目结构
```text
src/
index.ts # public API
builder.ts # TypeScript 规则 builder
graph.ts # Graph IR 与节点 ID
nodes.ts # 米家节点模板
compiler.ts # 规则编译与备份合并
validate.ts # 结构、连接、设备和能力参数校验
backup.ts # .bak 解包与打包
cli.ts # 命令入口
examples/rules/
index.ts # 最小规则示例
*.test.ts # Bun 测试
resources/
devices.json # 设备清单
*.bak # 真实备份样本
index.ts # public API
builder.ts # TypeScript 规则 builder
graph.ts # Graph IR 与节点 ID
nodes.ts # 米家节点模板
compiler.ts # 规则编译与备份生成
validate.ts # 结构、连接、设备和能力参数校验
backup.ts # .bak 解包与打包
cli.ts # 命令入口(零参数)
devices.json # 设备清单(由 fetch-devices 工具更新)
rules/
index.ts # 个人规则
tools/
fetch-devlist.ts # 中枢网关设备抓取工具
tests/
backup.test.ts
compiler.test.ts
validate.test.ts
dist/ # 输出目录(.bak 备份文件)
```
## 编写规则
@@ -50,7 +52,7 @@ resources/
规则直接使用 TypeScript
```ts
import { defineDevices, defineRule } from "../../src/index.ts";
import { defineDevices, defineRule } from "../index.ts";
const devices = defineDevices({
corridorLight: {
@@ -75,24 +77,23 @@ export default defineRule("走廊有人开灯", ({ device, on }) =>
## 打包命令
预览编译结果,不写出文件:
编译规则并生成 `.bak` 备份文件:
```bash
bun run pack -- --rules examples/rules/index.ts --devices resources/devices.json --input "resources/备份2026_4_26 19_17_42.bak" --dry-run
bun run pack
```
输出新的 `.bak` 文件:
自动读取 `src/rules/index.ts``src/devices.json`,从零编译,输出到 `dist/miot_{timestamp}.bak`
## 更新设备清单
从中枢网关抓取最新设备清单:
```bash
bun run pack -- --rules examples/rules/index.ts --devices resources/devices.json --input "resources/备份2026_4_26 19_17_42.bak" --output dist/miot.bak
bun run fetch-devices 192.168.31.166 048889
```
默认策略是追加新规则。显式替换可使用:
```bash
bun run pack -- --rules examples/rules/index.ts --input old.bak --output new.bak --replace-id 1728570847554
bun run pack -- --rules examples/rules/index.ts --input old.bak --output new.bak --replace-name 走廊开关灯
```
`048889` 是中枢网关屏幕上显示的 6 位 passcode。抓取结果直接写入 `src/devices.json`
## 校验策略
@@ -113,7 +114,7 @@ bun run pack -- --rules examples/rules/index.ts --input old.bak --output new.bak
bun test
```
测试覆盖真实备份解包统计、备份打包往返、规则编译输出、备份合并和常见校验错误。
测试覆盖真实备份解包统计、备份打包往返、规则编译输出和常见校验错误。
## 导入验证建议