Repository navigation
Releases
elab-Flow v4.0.0
elab-Flow v4.0.0 发布说明
GitHub Release 正文。tag
v4.0.0指向本版本内核提交。
详细变更见CHANGELOG.md的[V4.0.0]与[DSH 插件 1.0.0]两条。
这是什么
elab-Flow v4.0.0 —— 嵌入式闭环开发驾驶舱。agent 在一个面板里完成「发现 → 编译 → 烧录 → 调试校验 → 串口闭环」,
开发过程对用户全程可视化(阶梯进度、实时日志、RAM/FLASH 占用、多通道波形)。
本版是主仓大版本,同步发布 DSH 插件 1.0.0(npm 包 dsh-elab-cockpit)。
本版要点
帧协议补强:位域 / 变长 / 多 ID / 组帧
- 字段支持
bit_offset/bit_length/bit_order(lsb0默认、msb0线性大端位流),
有符号位域做符号扩展,位域只允许整型。 - 新增
frame.length_field(type: u8|u16、offset/endian/mul/add)与frame.id_field+variants
(按 id 分发字段,未命中进unknown_id并跳过)。 - 新增
serialcodec.encode:字段值 → 字节(枚举 label、逆scale/bias、位写入、
固定长/变长反算、head/tail/id/length/checksum 自动写)。 - 只读模板库
templates/frames/*.json:telemetry_u16、mavlink_v1、modbus_rtu、dlt645_read。 - 兼容红线:旧 profile 输出形状不变,未启用新特性时不出现
length_field/id_field/variants键。
Modbus RTU 主站(★ 新能力)
从「看得懂帧」到「能跟设备对话」,协议层补齐工业现场最常见的那条总线:
- 内核新增
services/elab/modbus.py(PDU 编解码 + CRC16 + 异常码 + 功能码元数据)与
services/elab/modbusmaster.py(串口事务、寄存器映射、轮询调度)。 - 功能码 01/02/03/04/05/06/0F/10 全支持,单次读、单次写、批量读写(FC15/16 一次多寄存器);
从站 1..247,0 号只用于广播写。 - 点表(31 点 / 5 组 /
rev乐观锁):点位带数据类型、字序、缩放与单位,
轮询按fast/diag/slow/bits四档分组,一轮 31 点合并成 8 条事务发出。 - 面板与 Agent 只渲染内核的
MODBUS_META自描述(单位、限值、时序、异常码、错误分类),
不各记一份数字。 - WebUI 新增
modbus工作区;DSH 插件右栏新增第 5 个页签Modbus:
连接条 / 统计行 / 点表 / 单次读写 / DMA 诊断卡 / 事务流水。 - Agent 侧新增门面
elab_modbus(meta·status·open·close·read·write·start·stop·transactions·map)。
配套固件例程 examples/STM32F411_modbus 演示硬件串口双缓冲的推荐做法:
循环 DMA + HT/TC(只作搬运提示)+ IDLE + 20ms 静默定界,发送侧软件乒乓
(HAL_UART_TxCpltCallback 链式续传);rx_drain() 三处调用者用 PRIMASK 临界区保护。
教程见 docs/tutorials/09-协议上手_Modbus.md。
Agent 自学习协议(★ 新能力)
不写一行命令,从陌生字节到直播解码:
- 串口监视出现陌生字节 → 复制样本 HEX;
elab_frame_learn action=learn产出草稿(置信度 / 回放验证 / 等长证据链);- 人复核字段名 → 落盘保存;
- 解码器下拉选 profile → 直播解码。
配套 verify / auto / codegen,learn 只产草稿不落盘。
工具链 provider(数据与执行分离)
- 新增
services/elab/provider.py:manifest 校验、版本约束、注册表、ResolvedToolchain解析、
安装/卸载与内容哈希复核。 elab provider list|search|install|remove、elab.lock.yaml、elab doctor --strict-lock;
market/index.json新增providers数组。- ESP32-S31-Korvo 工程迁移为
provider: espressif/idf@>=1 <2,ESP-IDF v6.1 实机跑通
编译 → 烧录 → 烧录校验 → 串口心跳闭环。
DSH 插件 1.0.0:Agent 工具门面化 27 → 15
破坏性变更。注册面从 27 个平铺 elab_* 工具收敛为 15 个混合入口(7 门面 + 8 细粒度):
| 门面 | action 枚举 |
|---|---|
elab_run |
build / triple / loop / step / preview / cancel |
elab_serial |
monitor / write / decode / decoded / stats / read / wait |
elab_debug |
open / control / inspect / breakpoint / wait / close |
elab_frame |
list / get / preview / save / delete / encode / templates / import |
elab_frame_learn |
learn / verify / auto / codegen |
elab_pkg |
status / search / install / activate / remove / update / verify / adapt |
elab_modbus |
meta / status / open / close / read / write / start / stop / transactions / map |
另有 8 个高频细粒度入口:elab_status · elab_guide · elab_log · elab_serial_read ·
elab_serial_wait · elab_serial_capture · elab_serial_widget · elab_debug_inspect。
elab_guide升级为 group → action 两层意图树,每个入口带同义词、前置条件与调用示例;
支持topic=overview|run|serial|debug|frame|pkg只取一组。- 工具契约上移 domain 层(
src/domain/tools.ts),执行实现留在 adapters。 - 过渡期:插件配置
toolMode: both会额外注册 17 个旧名别名(带废弃提示,执行全转发门面,
零重复实现)。默认facade不注册,上下文最省。
流程清单归位
STEP_META / KERNEL_PLANS 从 cockpit/server.py 挪到 services/elab/flow.py
(流程清单 = 芯片无关的步骤词汇与三档定义,唯一事实源),驾驶舱只引用不复制。
新增回归测试守卫「server.py 不得再内联流程清单」。
收尾健壮性批次
盘点报告 docs/reports/健壮性盘点_2026-11-05.md 的 11 条全部处置(8 条修复 + 3 条以更轻手段收敛):
GET /api/runs/active只读进程内活动登记簿;list_runs只读首尾行;- SSE 上限 8 → 16;调试壳层 SSE 按需建;断流状态可感知;
- 串口四路合并轮询(每拍 1 个请求带回四路增量);全部 fetch 加超时;
- run 清理入口
events.prune_runs(keep, days, dry_run); - 强杀内核不再留孤儿 openocd(Windows Job Object 兜底)。
安装
# DSH 插件(npm)
npm install dsh-elab-cockpit
# 或从源码路径装
dsh plugin --profile web add github:xkk6663/elab-flow#path:/packages/dsh-elab-cockpit
# 内核(从源码运行,无第三方依赖,Python ≥ 3.10)
git clone https://github.com/xkk6663/elab-flow.git
cd elab-flow && ./elab.cmd pkg bootstrap # Windows 用 elab.cmd上板另需 CMake + Ninja + ARM GCC + OpenOCD。
升级注意
- 许可证变更:自 v4.0.0 起本仓改用 Apache-2.0(此前 v1.0.0 – v3.1.0 为 MIT)。
已发布版本不受影响 —— MIT 授权永久有效。二次分发时请一并携带LICENSE与NOTICE。
详见 README 许可证小节。 - 插件默认下载的内核版本同步为
v4.0.0;最低兼容内核仍是2.1.0(MIN_KERNEL_VERSION,仅提示不阻断)。 - 若你的 agent 脚本用的是旧工具名(
elab_triple/elab_frame_profile/elab_debug_open…),
打开toolMode: both过渡,或按elab_guide给出的迁移表改写。 - 旧
elab_serial(project, data)直写形态由新门面的参数推断兼容(action可省)。
验证状态
| 项 | 结果 |
|---|---|
插件 npm test |
171 pass / 0 fail |
插件 tsc --noEmit(host + client) |
无错 |
插件 npm run build |
PASS(client.js 418460 B,满足宿主 ModuleLoader 契约,5 个槽位) |
插件 lib/ 与源码同步 |
二次构建指纹一致(幂等) |
| 内核 unittest | 687 passed / 5 skipped / 0 failed |
elab doctor |
通过 |
elab pkg index --check / elab lock --check --strict |
均一致 |
实机验证机型:STM32F103C8T6(COM10,115200 bps)、STM32F411CEU6、
STM32F411_modbus(Modbus RTU 从站,DAPLink CDC / COM10,115200 bps / 700 次事务 0 失败)、
AT32F421G8U7、ESP32-S31-Korvo。
文档
- 串口面板使用教程(含 §5.7 帧协议自学习按钮实操):
docs/tutorials/07-串口面板使用.md - Modbus RTU 上手(双缓冲 + 点表 + 批量读写实机演示):
docs/tutorials/09-协议上手_Modbus.md - DSH 插件上手:
docs/tutorials/05-DSH插件上手_STM32F103C8T6.md - 完整变更日志:
CHANGELOG.md
elab-Flow v3.1.0
elab-Flow v3.1.0
一套工具链 + 一条流程跑不同芯片:编译 → 烧录 → 调试 → 串口判据,业务工程零改动。
本版重点
- 调试工作区 P0–P3:会话式调试器(调用栈 / 变量 / 寄存器 / 断点 / 监视 / 内存 / 反汇编 / 外设 / RTOS 栈 / 审计 / 输出 11 页签);断点与监视持久化(
rev乐观锁);CMSIS-SVD 外设视图;FreeRTOS 栈水位。新增 6 个elab_debug_*agent 工具。 - 探针切换:
capabilities.meta.probes下发可选探针,工程行胶囊可原地切换 atlink / dap / stlink / jlink;新增POST /api/project set_probe。 - 闭环三态:
verdict = ok / failed / inconclusive;串口能开但没收到约定关键字记「未验证」,不再冒充通过;CLI 退出码0 / 1 / 2。 - 文档:README 重写(定位 → 是什么 → 功能 → 怎么用);新增教程 04 调试面板、05 DSH 插件;CLI / 波形 / 压测教程重编号为 06 / 07 / 08。
安装
- 插件:
npm i dsh-elab-cockpit@0.5.0,或dsh plugin --profile web add github:xkk6663/elab-flow#path:/packages/dsh-elab-cockpit - 内核:本 Release 附带源码包
elab-flow-3.1.0.zip;运行需 Python >= 3.10(仅标准库),上板另需 CMake + Ninja + ARM GCC + OpenOCD
完整变更见 CHANGELOG.md。
V2.0.0 —— OTA 平台化 · 双槽 A/B Bank · 组合工程
V1.0.0 交付"闭环工作链";V2.0.0 把 OTA 从单点能力升级为平台能力,并以 STM32F411CEU6 完成全链路实板验收。
✨ 相比 V1.0.0 的升级内容
- OTA 组件化
components/ota:core 场景层芯片无关 / port 平台层(flash HAL / Jump / 按键 / 复位);参考实现examples/STM32F411CEU6(APP)+examples/F411CEU6_BOOT(boot),含上位机工具链与驾驶舱可视化。 - 双槽 A/B Bank + 坏固件自动回滚:trial 试运行(先减并落盘再跳,3 次上电耗尽 →
=== ROLLBACK ===)·OTA_Confirm()心跳幂等晋级 · metadata 0x02 防回滚 · 0x17 版本查询决策。实弹四件套真机全绿(正常升级 / 坏固件回滚 / 版本决策 / 槽位交替,bank 记录 openocd 直读复核 active 0→1→0)。实弹抓出并修复 EraseRange 双语义潜伏 bug(向上对齐误用于整片擦除 → 坏固件"复活";新增EraseRangeFull)。 - 组合工程(C35):chips yaml 一字段
ota_layout.boot_project→elab build -p f411自动级联构建 boot;boot 烧录走 md5 指纹台账,日常 app 迭代 boot 字节级零触碰;驾驶舱工程轨 boot 子工程嵌在宿主卡正下方(可收起)。 - 分区表单一事实源:
ota_layout:→ 构建期 gen.h 强制注入 →doctor --deep三方对账;ELAB_MFPU下传-mfpu(Cortex-M4F 硬浮点)。 - skill 平台化:per-chip SKILL.md 淘汰 → 平台聚合(
skills/st/stm32、skills/artery/at32)。 - 驾驶舱 UI 重构:
workspaces.ts工作区注册表单一事实源;工具页可换行按钮行;OTA 投影 + boot 归属展示;默认端口 3333→8333(C34,避开 openocd gdb)。 - 质量门:单测 151→209 + 集成 37/37;五工程全绿;STM32 上板烧录/调试/OTA 全链路实板验证(V1.0 已知限制清零)。
完整变更见 CHANGELOG.md。
elab-Flow V1.0.0 —— 首个正式发布
[V1.0.0] — 2026-10-05(首个正式发布)
一套工具链 + 一套流程,驱动不同芯片的编译 / 烧录 / 调试 / 串口闭环 —— 业务工程源码零改动。
V1.0.0 是 elab-Flow 的第一个正式版本:八层架构(L0 芯片卡 → L3 CLI → L5 CI →
L6 事件流 → L7 驾驶舱)全部贯通,三个真实工程(AT32 两个 + STM32 一个)接入并
完成上板验收。零第三方依赖 —— Python 侧仅标准库,前端产物已入仓(运行时不需要
Node)。
✨ 功能总览
接入与构建(L0–L2)
- YAML 驱动接入:一个
projects/<name>.yaml接入一个工程;芯片参数
(chips/*.yaml)声明一次全局复用。 - 两类图形配置器工程的原样接入(约束 C1/C2 的技术支点):
- A 类(STM32CubeMX):
-DCMAKE_TOOLCHAIN_FILE接管工具链 + inject 在
project()之后"补回来"(-lm、.elf后缀等); - B 类(AT32 WorkBench):工具链行内
include()→ inject "抢回来"
(重置CMAKE_C_FLAGS、清链接旗标)。
- A 类(STM32CubeMX):
- 确定性适配器(
elab adapt):扫描图形配置器导出的工程 → 生成接入 YAML
(probe / write / check / verify 四段式);人工接管的文件绝不覆盖(A7 保护);
UI 一键适配(probe 只读在前 → write 落盘 → 卡片自动出现,写入后服务端
热重载 Config,约束 C29)。
闭环与 CLI(L3)
- 五步闭环(
elab loop -p <name>):doctor → build → flash → debug --verify → monitor,三个工程实测全绿(含上板烧录** Verified OK **、断点自检、
串口闭环命中)。 - 串口闭环判据引擎(
elab monitor):close_on/fail_on/ 静默超时 →
ok / failed / inconclusive三态;failed必须有正面失败证据;fail_on
对整缓冲区绝对优先(防"报活即崩"被掩盖);judge()为纯函数、38 例离线单测。 - 串口手写通道(
elab serial,M3-b):无状态往返(open→write→read→close),
与闭环天然串行;CLI 与驾驶舱共用同一份实现。 - 只读命令预览(
elab run/loop --dry-run、GET /api/plan):--clean的
删目录副作用显式标出(约束 C26:预览与实跑只有一份命令构造)。
CI(L5)
- 本地与云端同源(K9):本地
elab ci与 GitHub Actions 共用同一份
ci/matrix.yaml。三个 job:host-gate(三工程编译,云端已验证全绿)、
onhw-gate(上板步骤,self-hosted 门控)、web-dist-guard(前端产物一致性)。 - 产物路径由
elab ci --json的 build 步骤自报(约束 C22)—— 接入新工程
无需改 workflow;门禁绿却零产物 →exit 1(C23)。
事件流(L6)
elab run --emit-events把每步写成只追加的 JSONL 事件流(每 run 一个
文件、seq全局单调、单写者 C17);serial/*域事件链
(open → line → close → closed-loop)把"串口到底说了什么"落档。- SSE 推送:
proc/*100ms 合并、背压丢弃留痕(stream/overrun,C25)、
控制帧绝不丢(C26)、SSE 合并判据只用is_batched(C24 —— 实测事故的反向修复)。
驾驶舱(L7)
- 三列布局:工程轨(YAML 卡片 + 芯片卡 + 一键适配面板)→ 阶段轨(流水线状态带、
内存占位取自.map、产物、零改动守卫、阶段账本)→ 证据轨(构建/烧录/串口
三合一实时日志,环形缓冲 + 命令式 DOM 追加,上万行不卡)。 - 单步执行 = 独立按钮(C30):阶段轨一排六颗;证据轨各 Tab 内对应按钮;
可用性与置灰理由同源card.steps[id].ok。「跑全闭环」显式传步序,
空闲骨架与按钮同源。 - 串口 Tab 常驻监视(C31,serialmon):「打开监视 / 关闭监视」—— 读线程
异常自愈、单例一键关闭、写通道路由进会话;输出只活服务端环形缓冲
(seq增量 +gap丢行报告)+ 前端 600ms 轮询,不进事件流也不落留档。
监视与闭环双向 409 互斥、指名道姓。 - TX/RX 独立留档(C28):
serial-console.jsonl(有上限、会滚动、原子替换),
界面进工程/起闭环时按工程回填最近 60 条。 - 桌面一键启动:仓库根
cockpit.cmd+ 桌面快捷方式(图标cockpit.ico)。
幂等(已在跑只开 UI);UI 走 Edge--app独立窗口(无地址栏、任务栏独立
图标,观感即原生应用且零依赖),Edge 缺失回落默认浏览器;裸 TCP 探测不受
系统代理/TUN 影响;stdio UTF-8 守卫(C32 —— 修复"双击起服务后 UI 不弹")。 - 真浏览器验收:日志实时滚动、页面与控制台零报错、契约版本先校验再渲染。
📜 设计约束(本仓库的"为什么")
README §10 收录 C1–C32 共 32 条硬约束,每条都附"为什么"与(多数情况下)
一次真实事故。精选:
| # | 一句话 |
|---|---|
| C17 | 事件流单写者:只有 elab run --emit-events 写,其余一律不碰 |
| C22/C23 | CI 不写死产物路径;门禁绿却零产物 → 红 |
| C24–C26 | SSE 合并只认进程输出;背压丢弃留痕;控制帧绝不丢 |
| C28/C31 | 手写留档、常驻监视输出都不进事件流(两条道互不污染) |
| C29/C30 | 适配写入后热重载 Config;「跑全闭环」必须显式传步序 |
| C32 | stdout 被重定向 + GBK 区域编码会崩 CLI/服务 —— 包入口统一守卫 |
✅ 验收证据(仓库内可复核)
- 单元测试 151/151:
python -m unittest discover -s tests -p "test_*.py"(约 35s) - 后端集成 37/37(真起服务、真编译):
python -m unittest tests.it_cockpit_server(约 1min) - 上板验收:
at32f421g8u7五步全绿(烧录 Verified OK / 断到main.c:103/
串口 2.6s 命中[alive],无需--reset-port) - GitHub Actions:
host-gate在ubuntu-latest全绿(§8.1) - 前端产物一致性:重建后
git diff --exit-code cockpit/web/dist/零差异
⚠️ 已知限制(诚实清单)
- STM32 上板烧录/调试未验证(本机只有 AT32 板;命令已生成、只差 target cfg)
onhw-gate需要 self-hosted 探针(云端编译门禁不受影响)- SVD 在 IDE 中实际加载未实测
- 驾驶舱
profiles/*.yaml插件化装配(M4)、elab skill --adapt(M5.5)未实现 - 常驻监视的实时流只活服务端环形缓冲 + 浏览器本地缓冲(重启即失 —— 它是
"看",不是"证据";要证据走闭环 monitor 步骤)
📦 从源码运行
git clone git@github.com:xkk6663/elab-flow.git
cd elab-flow
python -m cockpit.server # → http://127.0.0.1:3333/(Windows 亦可双击 cockpit.cmd)
elab doctor_deep --all # 或 ./elab …(MSYS)/ elab.cmd …(cmd)要求:Python ≥ 3.11(仅标准库);可选:CMake + Ninja + ARM GCC 工具链 +
openocd(上板闭环用)。前端运行时不需要 Node(dist/ 已入仓)。