• 首页
  • 使用指南
    上传指南安装指南
  • API文档
    开发指南API调用API参考
  • 相关网站
    嘉立创EDA嘉立创社区开源广场
  • 编辑器
    在线编辑器(专业版)桌面客户端
  • 扩展管理
  • 登录注册
嘉立创产业服务站群

电子产业

logo

嘉立创PCB

PCB、FPC制造服务

logo

嘉立创SMT

一站式PCBA服务平台

logo

嘉立创激光钢网治具

激光钢网&治具制造

logo

嘉立创EDA

国产PCB设计工具

机械产业

logo

嘉立创FA

机械/电气零部件一站式商城

logo

嘉立创3D打印

树脂、尼龙、金属3D打印服务

logo

嘉立创CNC机械智造

机加件一件起订,3天交货

更多服务

嘉立创CAM

国产线路板CAM软件

Forface 3D

SaaS化3D技术服务平台

硬创社

好玩的硬件交流社区

供应商合作

一站式阳光采购平台

· EDA扩展广场
首页

使用指南

上传指南安装指南

API文档

开发指南API调用API参考

相关网站

嘉立创EDA嘉立创社区开源广场

编辑器

在线编辑器(专业版)桌面客户端
登录注册

EDA Agent Connector

zhoushoujian270v1.2.10
(3)MIT
Bridges the local agent daemon to the official eda.* API over a local WebSocket, dispatching typed schematic and PCB actions.
详情
更改日志
历史版本
评论

EDA Agent Connector

zhoushoujian270
(3)MIT
详情
更改日志
历史版本
评论

EDA Agent Connector

让 AI Agent 替你画板子。 这是 easyeda-agent 系统在 EasyEDA(嘉立创EDA专业版)内的官方连接器:配合本地 easyeda CLI/daemon 与 Agent Skill,AI 可以在真实编辑器里从一份客户口吻的需求文档出发,完成选型、放置、连线、分区标注、机械门禁校验,直到交付原理图与 PCB。

Skill / CLI -> Go daemon -> EDA Agent Connector -> 官方 eda.* API

一行看懂:Skill 描述专家工作流,Go CLI/daemon 提供有类型、可观测的动作与校验,本连接器把这些 typed actions 桥接到官方 eda.* API——它是整个系统中唯一直接调用 eda.* 的组件,每一步操作最终都落在嘉立创自己开放的插件能力上。

  • GitHub 仓库:https://github.com/zhoushoujianwork/easyeda-agent
  • 最新 Release:https://github.com/zhoushoujianwork/easyeda-agent/releases/latest

效果演示

AI 从空白页开始生成原理图——不是生成一张电路图图片,而是在编辑器里一步步执行 typed actions,放真实 LCSC 库件、连真实导线:

AI 在 EasyEDA 中从空白页生成原理图

切到 PCB:自动布局、板框贴合、铺铜、丝印,全程在真实画布上执行并回读校验:

AI 在 EasyEDA 中完成 PCB 布局、板框和铺铜

由 agent 驱动完整 PCB 流程产出的 ESP32-S3 成品板:自动布局 -> 板框贴合 -> 规则感知布线 -> 4 层电源平面 -> 丝印碰撞避让,DRC 在真实 EasyEDA 画布上验证通过:

ESP32-S3 成品板:4 层电源平面 + 圆角板框 + 位号对齐

v1.0.0:原理图功能正式上线

  • 原理图全流程 S0–S6 正式可交付:从方案书 -> 分页 -> 分区 -> 摆放 -> 布线 -> 机械门禁 -> 交付,输入只需一份不含 BOM/网表的客户口吻需求文档。真机回归用例:3 页原理图 / 26 个真实 LCSC 库件 / 18 网黄金表逐脚全对 / 复用 6 个电路块,逐页门禁通过。
  • sch gate --strict 五关机械门禁:一条命令依次过 layout-lint(真实渲染 bbox 查重叠)-> clusters -> check(悬空脚/交叉/压引脚/标签折叠等逐项 finding)-> bridge-check(短路/悬空判据)-> drc,顺序与阻塞判据固定在代码里——「看着对」换成「机械判对」。
  • bridge-check 新增 orphan-tree 悬空树判据:识别不触及任何引脚的导线树(挪件残留的网络标志 + 桩线、纯裸死线),此前 orphan-stub 与 orphan-flag 两个判据对这种形态双双结构性盲区,只能人工看图发现;现在 summary 返回 orphanTrees 计数,sch gate --strict 会阻塞放行。
  • 三层布局体系 Sheet -> Zone -> Group:分区框 + 区名 + 每模块电路说明全部由算法计算落位,生成与校验用同一把尺;多器件页未分区会被 sch check 机械拦下。
  • 电路块库 37 个(19 ready / 13 verified / 5 draft):CH340 USB 串口、ESP32 自动下载、按键去抖、USB-HUB、降压……easyeda blocks ls/show/search 离线可查(无需 daemon/窗口),sch block-apply 一条命令完成放件 + 连线 + 网表对账,引脚用功能名引用零改号。
  • 跨页网名审计与 netlist 黄金表对账:sch nets --strict 机械拦截网名变体/单引脚网(如 +3V3 vs 3V3 这类让主控静默断电的坑),sch reconcile 对账设计意图,netlist 黄金表逐脚比对——「接得合法」与「接对没有」分别有门。

已支持能力概览

原理图

  • 器件与库:从立创/LCSC 库按 uuid 放真实器件、换型号、符号/封装重绑、C 号确定性解析;库优先,手绘符号只是兜底。
  • 连线:connect/autoconnect(打分器自选方向,碰撞/穿件/图签全几何成本)、netflag/netport 自动补偿平台旋转存储的坑、成对删除。
  • 布局与可读性:模块感知自动布局(模板/官方双引擎)、对齐/等距/刚体平移、分页 reconcile、数据驱动分区框与电路说明。
  • 校验与导出:五关门禁、结构校验、跨页网名审计、sch read 一次读全(器件+网络+检查)、BOM 导出(自动补 LCSC C 号)、网表导出、页面导图 SVG/PNG/PDF、原生截图。

PCB

  • 布局:新建板并绑定原理图、模块感知自动布局(间距规则感知)、板框贴合/圆角、布局质量与可布性评分、丝印位置感知避让重排、自由丝印字串(板注/LED 极性标记)。
  • 布线与铜:启发式短线布线(规则感知线宽、障碍感知)、铺铜/禁铺区/过孔缝合、4 层电源分配(GND 内电层 + 电源平面 + 焊盘过孔缝合)、挖槽。
  • 叠层与制造:铜层数与内层类型设置、读取板子实时 DRC 规则并全链路遵循(缺失时回退 JLCPCB 工艺参考)、DRC/pcb check、Specctra DSN 导出/回导(对接外部 Freerouting)。

基础设施

  • Typed action 协议:--help 自描述、动作目录可枚举,结构化输入输出,AI 每一步可观测、可验收、可回放。
  • 连接器自愈重连看门狗(daemon 重启/窗口后台都能自动回来)、daemon 防抖自动保存、审计日志、窗口内非阻塞 toast 播报进度。
  • debug.exec_js 原型逃生口(需二次确认,不作为主工作流)。

完整能力清单与路线图见仓库 docs/FEATURES.md。

连接器本身做什么

这是一个真实可打包、可导入的 EasyEDA Pro 扩展,刻意保持很薄:

  • 本地 WebSocket 传输:端口扫描、握手、注册、上下文同步、心跳、自愈重连;
  • typed action 分发:把 daemon 下发的结构化动作映射到官方 eda.* 调用;
  • 结果序列化:执行结果、警告、错误、上下文回传 daemon;
  • 产物传输:截图、BOM、网表等二进制结果编码回传。

真正的工作流、校验、确认、产物处理和多步编排都在 Go CLI/daemon 与 Skill 层完成——所以必须配套本地 easyeda CLI/daemon 一起用,单装本插件没有任何效果。

安装与开始

1. 装本连接器(两条通道任选):

  • 在本市场页面点击「安装」——平台可原地自动更新,最省心;
  • 或从 GitHub Release(https://github.com/zhoushoujianwork/easyeda-agent/releases/latest)侧载 easyeda-agent-connector.eext——与 CLI 严格同版。

2. 装 CLI/daemon + Skill(一行脚本,自动检测 Claude Code / Codex 并装好 Skill):

curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | sh

3. 在 EasyEDA 中确认三件事:

  1. 已安装本连接器(市场安装或 .eext 导入);
  2. 已开启「允许外部交互 / Allow external interaction」——否则连接器的 WebSocket 连不上本地 daemon;
  3. 已启动本地 daemon(easyeda daemon start),easyeda health 能看到已连接窗口。

之后升级不必再跑脚本:easyeda update 一键升 CLI + Skill;easyeda update --check 只读三方(cli / skill / connector)版本对齐表。

版本配套约定

连接器与 CLI 遵循同一版本号——四件套(CLI/daemon、连接器、Skill、EasyEDA)需同版本同时在位,落后的连接器会被 easyeda daemon health 标成 stale。两条安装通道的取舍:

  • 市场版:平台可原地自动更新,最省心;但市场无发布 API,每版需人工重新提交,上架版本可能滞后于 CLI。
  • GitHub Release 侧载版:与 CLI 严格同版,需严格版本对齐时以它为准;代价是无原地自动更新,升级需手动卸载旧版再导入。

完整上手、版本对齐与升级注意事项见仓库 docs/quick-start.md。

更名说明(2026-08)

应市场管理规范要求,本插件显示名改为 EDA Agent Connector。内部包名与 uuid 均保持不变,同一条目重新上传——已装用户的原地自动更新不受影响,无需任何操作。

链接

  • GitHub 仓库(架构、路线图、能力矩阵、实战案例):https://github.com/zhoushoujianwork/easyeda-agent
  • Releases(严格同版 .eext + CLI 各平台二进制):https://github.com/zhoushoujianwork/easyeda-agent/releases
  • 完整实战案例:一份需求文档 -> AI 全自动画完 ESP32-S3 四层板,见仓库 docs/showcase-esp32-mini.md

MIT 许可,欢迎 star 与共建电路块库(一次贡献,署名可追,永久收益)。

Changelog

All notable changes to the EDA Agent Connector (the easyeda-agent project's connector extension) are documented here. The format follows Keep a Changelog; versions follow SemVer.

[1.2.10] — 2026-08-27

Fixed — README 演示图改回包内相对路径(1.2.9 换版本号重传未解决,定位到真因)

1.2.9 曾假设「市场服务端处理 README 偶发失败,纯换版本号重传即可」——这个 诊断错了。1.2.9 重传后逐字节 diff 市场存的 readme 字段与本地文件,发现除 三张图片行被整行删除外其余文字一字不差,不是粗暴的解析失败,是精确命中 这三行。扫了市场上 100+ 其它插件的 README(同款 image.lceda.cn 图床、同款 排版),image.lceda.cn 绝对链接普遍工作正常,排除了「服务端偶发抽风」。

真因转向:README 里硬编码的三个 image.lceda.cn URL 不是本次上传产生的 ——是半年前 0.23.0 那次转存时铸造的老链接,此后一直复用到 1.2.9。怀疑市场 对图片 URL 做了版本归属绑定,渲染当前版本时把「挂在旧版本记录下」的图片 引用当滤除对象。改回包内相对路径 images/demo-*.png|gif,让市场重新执行 「README 抽图 → 转存图床 → 改写链接」流程,为当前版本铸造全新 URL。

与 0.24.0 那次「相对路径抽图失败」的教训不冲突:那次是抽图步骤本身 出错(readme 字段整体缺失);这次绝对链接能正常返回图片,只是被 精确摘除三行,指向的是版本归属过滤而非抽图失败。若这次相对路径重新 抽图又失败,再退回绝对链接但换成全新图床 URL(而非复用旧链接)。

[1.2.9] — 2026-08-27

Fixed — README 重新提交(诊断有误,见 1.2.10 订正)

无代码/行为变更,纯 bump 版本号重传。原以为是市场服务端处理 .eext 时 偶发失败——订正见 1.2.10:实际是精确摘除三张图片行,不是偶发解析 失败。

[1.2.8] — 2026-08-27

Fixed — 旋转探测旗删不掉就漏在画布上,拖垮 sch gate --strict

detectRotationNegation() 为测平台的旋转语义(createNetFlag 在某些 build 上存储 取负)会在离画布极远处造一支一次性探测旗 __ROTPROBE__,读回 rotation 再删掉。

那句 delete 没有回读验证 —— 而「删除撒谎」是本仓在别处早已按批处理 + 回读 兜住的平台已知病(delete 返回真值而图元仍在);delete 抛错还会被 catch 吞掉。 一旦撒谎,探测旗就永久留在画布上。

代价不在电路,在判据:sch bridge-check 把它算成一条 orphan-flag,于是 sch gate --strict(S5 逐页门用的就是它)在一块电路完全正确的板子上 FAIL (2026-08-26 esp32MiniRequire 端到端实测,POWER 页)。

现在 delete → 回读 → 重试(至多 3 轮),仍在就经 eda.sys_Log 明着记一条并附上 清理命令 —— 沙箱里 console 是死代码,sys_Log 是唯一诊断出口。

daemon 侧另有一层收口(sch_tool_probe_residue.go):按网名把探测残留归类成 「工具自己的垃圾」,不计进板子的 orphan 账但照常报出 + 给清理命令。那一层对 已经装好的旧连接器立即生效;这一层才是治本。

[1.2.7] — 2026-08-26

Fixed — 图签其实一直能写:是回读太早把成功报成了失败(#186)

承接 1.2.6。修完损毁问题后实测「文本项写不进去」,一度以为是平台限制 —— 错了。

真机复验:把 Name 写成 "TB-BOOL-TEST" 的调用回执报 nothing was applied: Name(硬失败),三秒后再读,值好端端在那儿;单写 Drawed 同样如此。也就是说平台提交明细表是异步的,写完立刻回读拿到的是旧值, handler 把一次成功的写判成了彻底失败。

这条误报的代价远超它自己:它让「图签写不进去」变成流程里的既定结论 —— design-flow 因此禁用图签写入、sch gate --strict 的 missing-titleblock 被认定为结构性不可达。实际上那条路是通的。

修法:回读改成轮询到落定(命中即返回,常见路径零额外延迟;最多 4 次 × 250ms 退避)。 仍对不上才判 notApplied —— 那时它是真的没生效,不能拿等待去粉饰。

两个新单测钉正反两面:慢落定的写不再被误报(且只写一次 —— 重试的是读不是写); 始终不生效的项轮询完仍如实报失败。

[1.2.6] — 2026-08-26

Fixed — 明细表写入不再损毁图框(#186,社区报告 + 真机复现)

schematic.titleblock.modify 把调用方给的 titleBlockData 原样下发给平台。 于是最自然的用法——titleblock.get 拿完整数据 → 只改一个文本项 → 整包传回—— 会把 Device/Symbol 的 value("Drawing-Symbol_A4",那是符号的名字)一起写下去, 平台把它灌进了 sheet 的 component/device/symbol UUID 引用位:

修改前  component.uuid = 2cdbe1a3210dccf2   device.uuid = 2cdbe1a3210dccf2   symbol.uuid = bffa68140727fa20
修改后  component.uuid = Drawing-Symbol_A4  device.uuid = Drawing-Symbol_A4  symbol.uuid = Drawing-Symbol_A4
        Border 1→0    Title Block 1→0

EasyEDA 当场报「发现异常数据,以下元件的 器件/符号 属性有误」,保存后重启即拒载 = 图框丢失。 而动作本身还返回 ok:false(「nothing was applied: Name」)—— 报失败、画布却已被写坏, 是最坏的一种组合。这与「库占位 Designator 被灌进 otherProperty」是同一类事故: 读回来的投影字段不许原样写回去。

修法:下发前按结构键过滤。

  • 黑名单而非白名单:明细项的键名由图框模板决定(默认 A4 是 Name/Drawed, 另一些模板是 Title/Designer),白名单会把自定义图框的合法字段全拒掉; 而结构键是图框数据模型的固有部分,与模板无关,可以稳定枚举 —— 图框身份(Device/Symbol/ID)、纸张几何(Size/Page Size/Width/Height/ Blade Width/Region Start/X·Y Region Count/Title Block Position)、 开关(Border/Title Block/Color),外加 @ 前缀的平台投影项。
  • 原样带回来的结构键静默丢弃(值与画布一致 = 调用方并不想改它),回执给 ignoredKeys;
  • 真想改结构键则零变异拒绝(PRECONDITION_REFUSED),报文点名字段并给出正路 (换图框走 prim-delete --allow-sheet + place)。审计日志里那次「拿明细表当纸张属性写」 (Size/Width)的真实失败,现在在下发之前就被拦住,而不是写下去再报「没生效」。

两个新单测钉住:结构键拒绝时一次平台调用都不许发出;报告人的整包回传用法 下发 payload 里一个结构键都没有、只有那个真正要改的文本项。

[1.2.5] — 2026-08-26

Fixed — 「用户参数写错」不再把连接器染成 DEGRADED

新增错误码 PRECONDITION_REFUSED:handler 在动手之前拒绝、画布一个字节都没改 的那类失败。daemon 的写健康度(writehealth.go)完全不采样这个码。

起因是 1.2.4 的差分对命令加了三处前置校验(网名不在板上 / 同名约束内容不同 / 正负网填成 同一条)。真机连打几次错网名之后,daemon health 就把连接器判成 DEGRADED 并点名 pcb.differential_pair.create 是「最差路」—— 而连接器与平台全程健康。根因:健康度的 failed() 判据是「ok:false 且未证实落地 → 算失败」,它分不清**「这条路不通」**和 「你给的参数不对」。

误报的代价不是难看,是把真信号淹掉:同一个 failureRate 里既有「socket 死了、 register 被静默忽略」(issue #185 那类真停摆),也有「网名打错了」。

豁免必须窄,只收三个码:PRECONDITION_REFUSED / MISSING_PAYLOAD_FIELD / UNKNOWN_ACTION。INVALID_STATE 故意不在其列 —— 它既可能是「你要的事讲不通」, 也可能是「编辑器状态真的坏了」,一刀切会把真故障一起吞掉;要豁免的 handler 应显式改用 新码,而不是放宽白名单。使用新码的前提是零变异:已经写了东西就不许再用它 (该走 partial / 结构化成功,#151)。

差分对与等长组的 8 处前置拒绝已全部迁移到新码。四个 Go 单测钉住:拒绝零采样、 真故障码(含 INVALID_STATE、空码)照常计入、拒绝穿插在真失败之间不稀释失败率。

[1.2.4] — 2026-08-26

Added — 差分对 / 等长网络组终于能建了(#176)

pcb report 一直能测差分对 skew 与等长组 spread,但没有任何路径能建这两类约束 ——于是纯 CLI 驱动的板子上,那两个数组永远是空的,测量能力等于空转。平台其实早就给了 全套 @beta API(真机 probe:create/delete/getAll 都返回 true 且回读得到),是我们没做。

新 7 个 typed action + 两组 Cobra 子命令:

easyeda pcb diff-pair create --name USB0 --positive USB_DP --negative USB_DM
easyeda pcb diff-pair list | rename --name USB0 --to USB | delete --name USB
easyeda pcb eq-group  create --name DDR_ADDR --nets A0,A1,A2
easyeda pcb eq-group  list | add --name DDR_ADDR --nets A3,A4 | delete --name DDR_ADDR

每个 mutation 都按本仓库的规矩来:

  • 前置校验网名:约束指向一个板上不存在的网,平台照收不误但等于没建 —— 现在动手前 先比对 pcb_Net.getAllNetsName(),对不上一个字节都不写就拒绝并列出缺失网名;
  • 写后回读:平台返回的 boolean 不算证据,每次写完重读 getAll 比对,回执给 verified; 回读对不上直接报错而不是假报成功;
  • 幂等:同名同内容重建 = alreadyExists(可重放);同名不同内容 = 明确拒绝并给出下一步 (改名 / 先删 / 用 eq-group add 扩展),不静默覆盖;
  • 部分应用:eq-group add 若有的网落地有的没落地,回 partial + notApplied(画布已变 就不抛错,#151 约定),不整批回滚。

读侧统一走 constraintList 归一化 —— 平台自 v3.4 起 getAllDifferentialPairs 可能返回 对象 map 而非数组(官方标注的破坏性变更),两种形态都得当成同一份清单,否则形态一变 就会读成「板上没有约束」。

[1.2.3] — 2026-08-25

1.2.2 只在 dev 循环里打过包(未发版),它的条目并入本版。

Fixed — 放置器件时就把属性值带上,不再等到 PCB 侧 sync-attrs(#186)

sch_PrimitiveComponent.create 把 device 记录的 otherProperty 键结构复制到实例上, 但值全空。真机实测一颗 C0805:实例上 Value / Tolerance / Voltage Rating / Datasheet / Description 键都在、全是 "",而同一刻 lib_Device.get 返回的记录里 Value: "10uF"、Tolerance: "±10%"、Voltage Rating: "50V" 一应俱全。后果是 BOM 的 值列与器件标准化面板一路空着,要等流程很后面的 PCB sync-attrs 才补 —— 而那份记录 在放置当刻就在手里。

现在 place 落件后立刻回填(同 #157 supplierId 回填的 best-effort 契约:回填失败绝不让 放置失败),回执多一个 otherPropertyBackfilled: [...]。

判据与 PCB 侧 sync-attrs 收成同一把尺(PROJECTED_STATE_KEYS + planOtherPropertyBackfill 提到模块级共享,原先只存在于 PCB handler 内部):

  • 投影键永不写:库记录自带占位 Designator: "C?" 与模板 Name: "={Value}", 而平台会把 otherProperty.Designator 同步进位号 —— 这正是曾把 166/166 真位号 洗成 U?/C?/RF? 的那条路;写入时同一 call 重新断言真实位号,双保险;
  • 只填实例上已有的键:平台 create 已经把「这颗件该有哪些属性」的键集复制好了, 不新增键 ⇒ 结构上不可能把库占位漏到新实例;
  • 不覆盖已有值:手改与后续标准化都优先于库记录;
  • 幂等:填过一遍第二遍零动作。

同一 call 重新断言 designator + supplierId:整包 otherProperty 写会让平台 重新投影顶层字段。designator 那条是已知的(上面 166/166);supplierId 这条是本次 真机回读当场抓到的回归 —— 第一版只断言了 designator,结果实例的 C 号被打回平台默认 GRM21BR61H106KE43L.1(正是 #157 要消灭的不可下单值),而回执还印着 supplierIdBackfilled: C440198。同一块板上的前后对照:C99(旧构建)supplierId=<MPN>.1, C98(修复后)supplierId=C440198,两者 Value 都是 10uF。 教训照旧:回执不算数,回读才算数。

7 个新离线单测钉住上述每一条(含 166/166 位号洗白的回归、陈旧占位 Designator 清洗)。

[1.2.1] — 2026-08-25

Added

  • sch check 新规则 polarity-convention-outlier(WARN,#183 第一阶段)—— 同页电容电源脚约定一致性检查。 一颗钽电容正极接 GND 曾带着 51 条 WARN 顺利过 gate,打样上电约 10 秒后热失控才发现——DRC 看不见极性、 静态测量兆欧级测不出、现象带延迟。该规则的判据不需要器件极性领域知识:同页同类两脚电容中, 「一脚电源轨 + 一脚 GND」的多数派对"电源侧在哪个 pin 号"有强约定,违背多数派的那颗就是 #183 描述的 8:1 强信号。保守阈值防误报:命中样本 <3 不报(无约定可言)、多数派并列不报(歧义)、多数派占比 <75% 不报(--strict 会把 WARN 升级为阻塞,不允许掷硬币);串联/信号电容(两脚都不是电源地)天然排除, 候选口径 C+数字编号(CN 端子/CR 二极管不进票仓),地网分类含全拼 GROUND;totalMatched 只计真正进入统计的器件。已知限制:--all-pages 下候选跨页池化成一个约定而非逐页统计 (gate 默认单页不受影响),该模式下 finding message 会注明。finding 带 pins(电源脚,地脚)+ nets + 多数派归因,message 明确提示 MLCC 无极性可忽略;summary 新增 polarityConventionOutliers,Go 渲染端新增计数槽与修复提示行。 纯函数 detectPolarityConventionOutliers / isGroundLikeNet / isPowerRailNet 可离线单测 (8 个新用例含 #183 九电容真机复现)。ERROR 级极性判定(需封装/符号证据)留待 #183 第二阶段。

[1.2.0] — 2026-08-25

1.1.2 从未发版(无 tag),它的条目并入本版。 升级方式:CLI/skill 跑 easyeda update;连接器 sideload 必须手工重导入 (同 uuid 更新要先在「已安装」里卸载旧的,导入后完全退出并重启 EasyEDA)。

Added — 版本一致性门:工具链错位当场拒绝并给出修法

CLI / daemon / 连接器三方版本对不上时,easyeda health 给出 versionGate 判定, 后续动作在 /action 层被直接拒绝并附修法,而不是让人先怀疑电路或工具坏了。 明知故犯的逃生口是 --skip-version-check(会写审计)。

Added — S0 spec 位号回填进流程,不用再「每次落块回头改 json」

modules[].parts 写的是 designator,而平台会在 create 时按自己的全局位号重编 (计划 C1 → 落地 C11)。位号对不上不会报错,只会让分区打分/连接器规则静默少算 一个模块。现在 sch block-apply --spec <s0.json> 落块即回填,或事后 easyeda spec backfill … --write;写入是外科手术(只替换那一段字节,键序/缩进/ 未知字段一个不动),任一模块定位不到就整体拒写。

Added — --force-stale-read:STALE_READ 的逃生口从「不存在的 flag」变成真的

此前拒绝消息里印着一个并不存在的 flag,照抄跑不通。现在它是真 flag,带理由入审计, 且只放 PCB 读、解不开布线阶段门。

[1.1.2] — 2026-08-24

Fixed — 超时守卫改由 worker tick 兜底:队首卡死不再拖死整条队列

真机连续四次「连接器在负载下停摆」查到底了,根因不在重连、不在 WebSocket、也不在 daemon,而在主线程 setTimeout 在后台窗口里被节流/冻结,于是连接器所有基于 setTimeout 的守卫(FIFO 的放弃闸 22s、每次平台调用的 withTimeout 7s)到点不响。

证据(2026-08-24 三份 daemon 日志 + 审计逐条对齐):

  • 09:10:47 一条 schematic.power.connect_pin 进入 FIFO 队首,队列一动不动 6 分钟;
  • 同一时间心跳一拍不落(退化前后都是 3.00s/次,它由 Web Worker tick 驱动), 旁路读 document.current 每次 12ms 就回 —— WS、主线程、eda.* 桥全都活着;
  • 排在后面的 12 条 schematic.pages.list(本身 p50 只有 15ms)每条各烧满 18s 才报 "connector did not respond",合计白等 216 秒;
  • 队首终于 settle 后,积压的 12 条按 FIFO 顺序一次性冲出来,全部 ok:true;
  • 队首那条的错误码是 EDA_* 而不是 ACTION_ABANDONED —— 三份日志与全部审计 记录里 ACTION_ABANDONED 出现 0 次:放弃闸自上线以来一次都没响过。

修法:新增 src/deadlines.ts,把所有「到点必须发生」的守卫登记成绝对时刻, setTimeout 只当快路径,worker tick 的 sweepDeadlines() 是保底路径 —— 那是本 进程里唯一被真机证明不受后台节流影响的时基(看门狗当初正是为此搬进 Worker 的, 只是队列和 per-op 守卫被落在了老路上)。action-queue 的放弃闸与 actions.ts 的 withTimeout 一并改用它。保底路径的分辨率是一拍(3s),所以短守卫最坏晚一拍触发 ——远好过晚六分钟。

行为变化:队首卡死时,连接器现在会在 timeoutMs + 2s 真的放弃它并回 ACTION_ABANDONED,队列继续流动。收到这个码 = 那次写的效果可能稍后才落地, 关于它的任何结论都不成立(seqAbandoned 已递增),必须回读复核后再决定,不要盲重试。

Fixed — 两处「两把尺」:state 身份靠名字背 / block-apply 落点只看器件本体

  • state 身份:工程被同名删除重建后,旧工程的页记账会继续参与跨页匹配,让 spec backfill / 分区打分把死页算进分母。新增 easyeda workflow pages --reap (拿活体页表核销)与 --prune(清数据);核销后的页会被 WARN 点名并明确排除出分母。
  • block-apply 落点:落点搜索此前只把「器件本体」当障碍,不算 marker 晕圈,于是 同一页先落主控再落 LED 会撞出图元重叠。现在为 marker 预留约 105 单位—— 副作用是落点可能离 --at 更远,挤的时候跑 sch clusters 看组间压没压到。

Fixed — zone-draw 拒画:规划器自己造的违规先让掉,拒了也要说得出挪多少

两个内容分得开、只是版面余量对撞的区,现在直接画得出框。真画不出时报文给出逐条 最小位移(sch zone move --zone X --dy +N)。版面知识:竖着叠的两个功能区之间要留 ≥96 单位(24 边距 + 42 说明带 + 30 区名带),横着排的贴着放也画得出框。

Fixed — 电路说明不再被甩出分区框;missing-partition 改看画布而非本地记账

说明带的三把尺收敛成一把;sch check 的分区判据改由画布上的区标题文本作证 (与 zone-draw 生成标题同一个函数),消除「画布上明明有框、check 永远说没有」的恒报。 同时新增 page-too-small 判据:块/组比整页可用区还大时停手交回用户(拆页是设计决策, 工具不自动分页)。

Known issues — 随版本如实公布

一次广度优先的端到端(esp32Mini 固定用例)记了 19 条挂账,完整台账见仓库 docs/e2e-round-2026-08-25-findings.md。升级前值得先知道的三条:

  • sch group-move --ids 报「电气自检失败」却不回滚:位移照样落地,留下悬空脚 + 悬空树。看到那个 ✗ 不要当作没发生,先 sch bridge-check 复核画布。 单件带线搬请改用 sch group create + --group,或 disconnect → modify → connect。
  • sch destagger --apply 在相邻引脚场景仍会共线合并成短路,且「已按快照自动恢复」 这句话在没真恢复时也会打印。跑完必须 sch bridge-check 验一遍。
  • sch gate --strict 目前无法出 verdict=pass:missing-titleblock 的唯一处方 (写图签)当前被 design-flow 禁用,平台 DRC 又只回聚合数没法清零。用非 strict 档, 把这两类如实写进交付摘要。

[1.1.1] — 2026-08-21

Docs — SKILL.md 顶部写清「这个 skill 单独装上没用」+ 连接器下载地址

从 skill 市场(skillhub / ClawHub)装到这份 skill 的人,拿到的只是指挥说明—— 真正干活的是本机 easyeda CLI/daemon 和 EasyEDA Pro 里的连接器插件,两个外部件 一个都不能少。此前顶部只在一句话里夹带了插件市场链接,没有可直接照做的安装步骤。

现在写成三步:① 一行装 CLI;② 连接器 .eext 两个下载入口——立创EDA官方插件市场 (一键装、可原地自动更新,但版本可能滞后 CLI)与 GitHub Release 直下(与 CLI 严格 同版,四件套同版以它为准),并写明「同 uuid 更新必须先卸载旧的、导入后必须完全退出重启 EasyEDA」这两个静默失败点;③ 开「允许外部交互」并用 easyeda health 验证。

CLI / daemon / 连接器行为无改动,纯文档版本。

[1.1.0] — 2026-08-21

本版把 1.0.3–1.0.5 三个未发布的中间版本一并放出。minor 而非 patch,因为下面 第一条是行为破坏性变更 —— 升级后一批此前「能跑」的 PCB 读会开始报错。

⚠️ BREAKING — 铁律 5 从劝告升成机械门:PCB 脏读现在被拒绝

PCB mutation(rip-up / route / delete / via / track / pour)之后、easyeda doc reload 之前的 PCB 读(list / DRC / report / nets …),会被 daemon 在 /action 派发层拒绝, 错误码 STALE_READ。此前它只是一行非阻塞的 stderr 警告。

为什么升门(有实测,不是拍脑袋):把 49 天 / 171554 条审计记录里每条铁律的遵守率 和它在 SKILL.md 里占的篇幅对齐,两者完全反相关 —— 有 daemon 拦截的阶段门(铁律 14) 7 次跳步全被拦、0 漏网;而只发警告的铁律 5 被违反 1780 次(18.1%)。文字铁律的 天花板约 82%,机械门是 100%。

拒绝消息自带能直接执行的下一步,不只指路:

pcb.components.list —— PCB 自 pcb.line.create 后未 reload,读到的是旧引擎状态。
下一步: easyeda doc reload --project ceshi
(绕过: --force-reason "<理由>",入审计)
  • 升级后要注意的:布完线直接跑 easyeda workflow advance / pcb check / layout-score 会撞 STALE_READ。这不是命令坏了 —— 在旧引擎状态上判 check 门 本来就是假绿灯。先 easyeda doc reload 再跑。
  • 豁免:pcb.save / pcb.pour.rebuild / 任何 --dry-run 预览 / 只改视图的 view-side·layers set-current·layers visibility / pcb.snapshot(它仍只带 advisory —— 截图白帧的修法是切前台而不是 reload,拒它等于递一条修不好问题的命令)。
  • 绕过:--force-reason "<理由>",审计里记成 daemon.stale_read.force 伪动作行。
  • 内部的「写后回读验证」类命令(pcb refine / sync-designators / import-changes / power-planes / power-pour / route-critical / autoroute / pcb clear / playbook verify: 块)已逐条加上窄到一次调用的放行位,不受影响;而 refine 下一轮开头的规划读等仍然被拦 —— 那正是这道门要防的。

Changed — STAGE_BLOCKED 的拒绝消息也带上补门命令

此前只说「see easyeda workflow status」,现在直接给出该跑哪条: pcb stage confirm-tier / confirm-outline / pcb layout-lint --gate / workflow advance,按缺的是哪道门决定。

Fixed — copperLayerCount 读不到时不再静默按 2 层降级

板子若在命令开跑前就脏,一块 4 层板会被当成 2 层,于是走 power-pour 而不是 power-planes,两条电源轨挤在同一层 —— 正是内电层要解决的那个冲突。现在会把降级 明确说出来。

Changed — 连接器端口钉死 60832 + 指数退避

见下方 [1.0.5] 条目全文。摘要:daemon 重启后的重连从「十几秒」降到 ~2-3s; 顺带修掉「SLOW_RETRY_DELAY_MS = 10s 因为看门狗每 3s 抢先调用而从未真正生效」。

Added — skill 发布链路

  • 适配 Agent Skills 官方规范:补齐 license / compatibility / metadata 三个字段,skills-ref validate 通过;版本号随 make release 自动同步。
  • skillhub.cn 走 CI 自动发布(订正旧结论「skillhub 无 CLI」——现在有真 CLI): release: published → .github/workflows/publish-skill.yml。slug 为 eda-agent-connector,与立创插件市场的连接器条目同名。

[1.0.5] — 2026-08-20

Changed — 端口钉死 60832 + 指数退避重连(不再横扫 10 个口)

daemon 重启后的重连从「十几秒」变成「秒级」。 daemon 早就只绑 一个 固定端口 60832 且从不外溢(internal/app/cmd_daemon.go:60832 被占就替换/拒绝,绝不换个口 悄悄再起一个),但连接器这头还在扫 60832-60841 全段。60833-60841 结构上不可能 有 daemon,扫它们是纯空转 —— 而 eda.sys_WebSocket.register() 从不报告「连接被拒」, 每个死端口都要烧满整个 CONNECTION_TIMEOUT_MS。用户真实插件日志(2026-08-20 23:41) 里,光走 5 个死端口就花了 7 秒,且 make dev(air)每改一次 .go 就要重连一次。

  • 只试 60832:默认端口表长度固定为 1。
  • 指数退避:首次立即,失败后 0.5s → 1s → 2s → 4s → 8s 封顶,各带 ±25% 抖动。 一次尝试成本 ≈ 200ms(REGISTER_DELAY_MS)+ 1500ms(CONNECTION_TIMEOUT_MS), 所以 daemon 重启这种「一两秒就回来」的常见场景稳定在 ~2-3s 内重连;真的长时间 没有 daemon 时则退到 8s 一次的安静轮询,对 EasyEDA 共享 socket 表的压力比原来固定 3s 轻约 3 倍,也比原来 10s 的慢轮询恢复更快。
  • 退避是真的生效的:新增 nextAttemptAt 时间闸。看门狗每 3s 就会调一次重连, 原来的 SLOW_RETRY_DELAY_MS = 10s 因此从来没有真正慢下来过(定时器排的时间被 看门狗抢先)。现在所有非强制入口都要过这道闸;手动重连 / 窗口回到前台 / 退避定时器 到点这三条是强制路径,不受闸限制。
  • 换 wsId 的阈值 2 → 4:一次「失败」过去是 ~18s 的整轮扫描,现在是 ~1.7s 的单次 尝试。阈值不动会把换 id 的节奏压到几秒一次,在 EasyEDA 共享的 socket 表里堆死 id —— 正是这段逻辑当初要躲的 race。
  • 逃生口(没有焊死):扩展用户配置 daemonPorts 可覆盖端口 —— eda.sys_Storage.setExtensionUserConfig('daemonPorts', '60832-60841')、 '60840,60832'、60900 都认;每次尝试开始时实时读取,改完下一轮重试就生效, 不必重装 .eext、不必重启 EasyEDA。坏值一律退回钉死的默认;覆盖列表封顶 12 个口 (手滑写 1-65535 不能把重连变成无尽扫描)。60832-60841(0xEDA0-0xEDA9) 仍是我们保留的专属段,依旧刻意远离官方 eext-run-api-gateway 的 49620-49629。
  • 回归测试 src/transport-ports.test.ts(离线,12 条)钉住:默认表长度必须为 1、 退避阶梯与封顶、抖动边界、逃生口解析与去重上限、多端口时 lastGood 优先。

[1.0.4] — 2026-08-20

Changed — 动作串行化(FIFO)+ 放弃机制 + 顺序证据三字段

行为变化,读写对齐的地基。 此前连接器并发处理动作: transport.ts 把每条 WebSocket 消息交给各自的 onMessage 回调,而 await 不跨回调排队,于是两条动作可以同时在飞。用真 transport.ts + 假 eda 全局跑的 探针实测(2026-08-20):写还没 settle,读的 handler 已经开跑,响应也先发了出去。 结果就是「先发写、再发读」在连接器里不构成任何先后关系 —— 一次回读报 「那里什么都没有」,既可能是真的没有,也可能是读得太早,两者在观测上完全等价。

  • 真 FIFO:所有动作走 handleRequest 这一个咽喉,每窗口一条显式 promise 链, 一次只跑一个 handler。回归测试 src/transport-fifo.test.ts 驱动真 transport 钉住这一条。
  • 放弃机制(与 FIFO 同等重要):队首超过请求自带的 timeoutMs(+2s 宽限, 晚于 daemon 自己的超时)仍未 settle,就放弃等待它、seqAbandoned++、队列继续 流动,并回一条 ACTION_ABANDONED。截止时间绝不写死常数 —— sch check/DRC 这类合法长操作能跑 60s+,固定门会把它们全误杀。没有这条,一个永不 resolve 的 handler 会吞掉后续一切(真机见过:一次卡死让接下来 4.5 分钟的 place/delete/document.open 全部静默消失,而轻读照常)。
  • 顺序证据三字段:每一条 response frame 新增 seq(已完成动作数,本动作完成 之后的值,单调递增)、seqAbandoned(累计被放弃数)、unordered(可选,true = 这条响应走了旁路通道、其 seq 不构成顺序证据),外加便利字段 abandonedIds (最近 ≤32 条被放弃的 request id,让判定能点名而不只是数数)。
  • 旁路通道:document.current 一条(名单短、理由写在 action-queue.ts)。 纯读、代价恒定、且「读得太早」的失败方向安全(它只会报旧页面让 --doc 门重试, 不可能谎报已切到目标页)。wedge 期「轻读还能用」是唯一的观测手段,不能因为串行化 而失去。旁路响应必须打 unordered。
  • 溢出保护:队列积压上限 64,满了回 QUEUE_OVERFLOW(该动作没有执行), 不无限堆积。

seq 证明什么、不证明什么(别越界):它只证明「W 的 handler 在 R 的 handler 开跑前就 settle 了」——不是「文档已提交」。eda.* 可能在 handler 返回后才落盘, 那一层我们没有观测点。CLI 侧所有基于 seq 的措辞都停在这条边界内。

版本搭配:

  • 老 CLI + 新连接器 —— 正常。三个字段是新增的顶层字段,老 daemon 解析响应 时直接忽略;FIFO/放弃对老 CLI 是纯粹的行为改善(不再有并发写读交错,卡死的队首 不再吞掉后续动作)。唯一可见差异:极端积压时会收到 QUEUE_OVERFLOW,老 CLI 把它 当普通失败报出。
  • 老连接器 + 新 CLI —— 正常,但判定降级。sch block-apply 的 place 超时 收编会发现响应不带 seq/seqAbandoned,自动退回原来的探针启发式,并在报文里 打上「证据档:弱(探针启发式)」+ 升级连接器的下一步。绝不会因为缺字段就默认 「新鲜」。侧载的 .eext 与 CLI 严格同版;市场装的那份可能滞后若干 minor,那就是 会落到这一档的典型情形。

随版 CLI 侧修复(连接器无关)

本条记录随版 CLI 侧对「删除/组注册」三缺陷(esp32Mini E2E 交接报告 §六 缺陷 2/3/4)的修复,便于版本对照:

  • 删器件级联删组注册(缺陷 2,P1):虚拟组注册表存在 Go 侧 (workflow.State.GroupsByPage,~/.easyeda-agent/workflow/<project>.json), 连接器的 component.delete 级联(ADR-0004 Decision 5,只清桩线/flag)够不到它。 现在 sch prim-delete 与 block-apply 回滚在回读证实删除成功后同步摘除该 位号的成员记录(指向死位号的 role 一并摘,组删净则删组)——位号复用不再被 陈旧组吃掉。
  • 删除不可靠→逐个删+回读证实+重试一次(缺陷 3,P1):平台批量 delete 静默 no-op 仍返 true(真机:zone-draw 删旧框 survived=4、回滚 deleted=false,逐个删 100% 成功)。Go 侧新增 deleteVerifiedOneByOne 统一语义;block-apply 回滚改 逐个 component.delete,zone-draw 删旧框/绘制回滚的 exec_js 内联同一套 逐个删+重试。判定只信回读。
  • sch group create --block-id/--instance/--roles(缺陷 4,P1):组注册损坏后 可手工重登块溯源(与 block-apply 自动登记同一批字段),sch reconcile 恢复 机械对账(reconcile 需要 --block-id 加 --roles ROLE=位号)。

[1.0.2] - 2026-08-19

ADR-0004「挪动收敛为单一安全 move 内核」首批随版(源自 issue #181 两份 E2E 复盘)。CLI 侧:schMoveKernel 五步管线(快照→删证回读→snap 移动→快照重连→ 电气对账,失败自动恢复、目标页失效 fail-closed),group-move/zone move/ zone-arrange/relayout/**destagger(解禁)**五命令收敛为内核调用方, group-move --groups 多子组一次整体移动;--zone/--group 统一命名空间 (一张注册表+来源标签,报错列全量可用名);dry-run 纯计算机械保证(派发层 拒 Mutates)。连接器侧两条见下。

Fixed

  • pcb.component.modify 解锁假成功(#174):平台 modify() 的真实锁字段是 primitiveLock,而我们的读侧(pcb list)一直报 locked,调用方自然传 {"locked":false} —— 平台静默忽略未知键仍返回成功(真机 22/22 报 ok、 reload 后 22/22 仍锁定)。现在:(1) patch 归一化,locked/lock 别名映射到 官方键 primitiveLock,契约外的未知键硬报错(不再允许静默 no-op); (2) 每次写后新鲜回读逐字段核对(modify 返回对象会回显输入,不可信),结果 带 verified + applied/notApplied/unverified;(3) 回读发现锁写被丢时 自动改走 setState_PrimitiveLock + done() 写路径(pcb.track.lock 验证过 的模式)重试并再核对(lockFallback:true);(4) 按 #151 部分应用约定:画布 已变(部分字段落地)返回 ok + 结构化 notApplied,零字段落地才报 ERROR。

Added

  • schematic.component.delete 级联清理(ADR-0004 Decision 5):删件后自动 找出只挂在被删件 pin 上的桩线树(union-find 共点归树 + 点到线段锚定,与 bridge-check 同一套判定)以及挂在这些树上的 netflag/netport/netlabel,一并 删除并回读证实。树若还触及任何存活器件的 pin 即视为共享,绝不删;被删件 自身残留(删除撒谎)时其树也整体跳过。结果新增 cascaded: {wires:[ids], flags:[ids]}(只列回读证明已删的 id);级联删除 撒谎的存活 id 按 #151 部分应用约定计入 notApplied(ok 保持 true + warning)。 根治「删件残留桩线/旗被后放件静默继承网名」的幽灵连接(v1.0.1 的 orphan-tree 判据只能事后抓,现在事前防)。CLI 渲染点(prim-delete / block-apply 回滚) 带一行「级联清理 N 桩线 M 旗」。

  • schematic.component.delete 新 payload 字段 cascade:false(退路):保持 旧行为(只删组件本体,不碰桩线/旗)——自己管整树删除的调用方(如 ADR-0004 的 move 内核)必须传它,避免级联与内核的整树管理相互踩踏。默认 cascade:true。

  • pcb.component.lock — 批量组件锁定/解锁(#174):输入 primitiveIds[] + locked,走专用 setState_PrimitiveLock + done() 写路径,写后新鲜回读逐件 核对;结果 applied/alreadyInState/notApplied/missing + verified。 幂等(已在目标状态的只计数不重写);全部未落地时报 ERROR 而非假成功。CLI: easyeda pcb lock --ids id1,id2 [--unlock] / easyeda pcb lock --all --unlock (整板批量释放,--all 由 CLI 读活板 component 列表展开)。

[1.0.1] - 2026-08-18

连接器侧一条修复(见下);CLI 侧同批落地:artifact 目录递归嵌套归一、 --doc 对读命令生效、board.rebind 目录补登记(UNKNOWN_ACTION 出口补审计)、 裸 sch connect 35s 预算 + 慢速落地复核(slowLanded)、sch group-move 半途失败自动重连恢复、sch note --zone 框满走廊落点、sch autoconnect 带痕候选 WARN + --strict。

Fixed

  • schematic.pin.disconnect 假成功:此前删除只调 delete 后不回读,平台对 并入共享树/共线段的桩线静默 no-op 仍返 true,动作照样报 disconnected:true(真机复现:R5:1 / R5:2 / C4:2 断开后网表仍连)。且坐标 定位只取第一根触脚导线就 break,同脚多桩场景天然漏删。现在:(1) 收集全部 触及目标 pin 端点的导线一起删;(2) 删除后 getAll 回读验证,存活即按部分应用 约定返回结构化 partial(ok:true + partial:true + notApplied/ survivedIds,disconnected 仅在全部证实消失时为 true,deletedWires/ deletedFlags 只计证实删除的 id)并附 warnings;CLI sch disconnect 把 partial 渲染为醒目 stderr 警告(不再静默成功)。

[1.0.0] - 2026-08-18

里程碑:原理图功能正式上线(S0–S6 可交付)。 版本从 0.26.x 跃迁至 1.0.0, 连接器与 CLI/skill 同版(四件套同版约定)。0.26.1 未单独发布,其连接器变更 (schematic.bridgeCheck 的 ORPHAN_TREE 悬空树判据,见下方 0.26.1 条目)随本版 一并发布。1.0.0 的主体变更在 CLI/skill 侧:三层布局体系(Sheet→Zone→Group, 分区框/区名/电路说明算法落位,生成与校验同一把尺)、sch gate --strict 五关 机械门禁、跨页网名审计 sch nets --strict、块对账 sch reconcile、netlist 黄金表逐脚比对;esp32Mini 真机端到端回归通过(3 页 / 26 件 / 18 网全对)。 连接器 0.26.x 与本版 CLI 协议兼容,但 orphan-tree 判据需本版连接器才生效。

[0.26.1] - 2026-08-18

Added

  • schematic.bridgeCheck 新判据 ORPHAN_TREE(悬空树):wire 树不触任何 引脚 —— 挪件残留(flag+桩线随器件移动被遗留原地)或纯裸死线。此前 ORPHAN(要求树触到引脚)与 ORPHAN_FLAG(要求 flag 不挨任何导线)对这种 形态结构性盲区:真机 2026-08-18 P2_MCU 页两棵 GND flag+桩线残留树, bridge-check 连报 0 orphan,靠渲染图人工数 flag 才抓到。summary 新增 orphanTrees 计数;CLI ≥ 同版把它渲染为 orphan-tree(WARN,gate --strict 阻塞)。旧 CLI 读新连接器只是忽略新字段,不破坏兼容。

[0.26.0] - 2026-08-17

连接器侧无代码变更 —— 版本号随 CLI 同步(四件套同版约定)。本版全部变更在 CLI/skill 侧:sch zone-arrange(功能区确定性布局两段求解 + --apply 断言门)、 sch status/sch nets/sch reconcile/sch clusters/audit cost 新子命令、 图框(sheet)误删双层守卫与 sch titleblock --data 写入禁用令(写路径会损毁 sheet 符号引用,重启后图框丢失 —— 修复处方见 skill actions.md)、原理图 SOP 步骤卡。连接器 0.25.x 与本版 CLI 完全兼容。

Changed

  • 许可证正式落地为 MIT:此前仓库根本没有 LICENSE 文件(GitHub 视角 = 版权 全保留,严格讲不是开源),声明只散落在 NOTICE/清单里且互相打架(根 package.json 写 MIT、连接器写 Apache-2.0)。现在补齐根 LICENSE(MIT), extension.json 的 license 随之改为 MIT、package.json 改为 SPDX 复合 表达式 (MIT AND Apache-2.0)。例外:src/beautify/ 下四个文件移植自 Easy_EDA_PCB_Beautify(m-RNA),继续沿用 Apache-2.0 —— 无权改,也不必改(两者 兼容)。许可证全文放在 src/beautify/LICENSE,.eext 包内新增 extension/ LICENSE 承载 MIT 全文 + 第三方告知(dist/ 里含 beautify 的编译产物)。

[0.25.1] - 2026-08-13

修复立创插件市场审核驳回「README图片未加载成功,请检查存储路径」(0.24.0 被拒)。

Fixed

  • README 演示图改用平台图床绝对链接:三张演示图从包内相对路径 images/demo-*.png|gif 改为 https://image.lceda.cn/extensions/images/...。 根因不在路径写法——0.23.0 用同一份 README 过审,包内容三版字节级一致; 真因是市场服务端解析 .eext 时的「README 抽图 → 转存图床 → 改写链接」 那一步偶发失败:过审的 0.23.0 库里 readme 字段是 image.lceda.cn 绝对 链接,被拒的 0.24.0 则没有 readme 记录,审核员打开就是三个裂图。改用 平台自家图床的绝对链接后不再依赖那一步(链接本身正是平台为 0.23.0 转存生成的,字节与包内图片一致)。图片文件仍随包发布(images/ 保留, logo 走 manifest 的 ./images/logo.jpg 不变)。

[0.25.0] - 2026-08-12

原理图布局体系定版:placement-first 区级重排(sch zone relayout)+ 串联链 共线串接 + 全员竖放平行对齐 + 顺方向 netport + 竖直旗真值表修正 + 三个新判据 (reversed-net-flag / marker-overlap 文字带 / redundant-net-marker)。 连接器含 0.24.1–0.24.5 全部修复(合并线段对解析三处统一/orphan-stub 直连豁免)。

Added(CLI 侧,串联链 chain——用户拍板「一串完成不折弯」)

  • relayout 识别 pin-to-pin 直连链(如 GND—LED—R—netport):全链共线横放 串接,相邻 pin 短直线、零折弯;地端在左(旗竖直向下)、netport 端在右 (水平顺链向);极性件(LED)rot 按「链左 pin 实测在左」消解。链宽超区带 报错提示手动分段(断点两侧同名 netport 对、2+2 分行)——能一串就一串, 不主动加标签。
  • band 生长障碍钳制修复:旧判据只认「完全在外侧」的障碍,初始 inflate 相交的邻区被忽略 → 生长穿透邻区腹地(实测 LED band 穿进 MCU 区,链件摆进 别人家)。凡与 band 正交区间相交且伸过边缘的障碍一律钳制,已相交钳在原地。

Changed(CLI 侧,netport 顺方向摆布——用户拍板,取代「永不竖放」铁则)

  • netport 顺导线方向摆布:竖放件的 netport 顺竖直引出(rotation 走 orientation port 真值表 up=90/down=270),不再强制水平——水平引出的 L 形 正是件间距不等的根源;现在全员回归 60 等距完全平行。旧铁则「netport 永不 竖放」的真实痛点是密集 pin 列上侧向标签互相堆叠——那是拥挤,由 marker-overlap(netport 平台 bbox 天然含文字)管;folded-net-label 判据 恒零(函数与 summary 字段保留,报表兼容),layout-score folded 维恒满分。
  • 相关测试翻转为语义变更回归钉(竖放必须不再报);宿主解析测试改为直测 hostByNearestPin/hostByWireTrace 纯函数(原借 folded 归因当载体)。

Changed(CLI 侧,relayout 全员平行布局——用户拍板)

  • 外围电容电阻全员竖放、同一行、平行对齐:此前去耦竖放/信号链横放两种姿势 (同是电容 C4 竖 C5 横,不工整)。现在 signal 件也转竖放——电源旗端朝上/地旗 端朝下(与双旗件同轴),netport 从另一端水平朝左引出(netport 永不竖放 不变);全员器件锚 y 相同 = 本体/顶旗/底旗三条线全对齐。间距:纯双旗件 60, 带 netport 件 110(容水平文字)。双 netport 件(无电源轴)保留横放 fallback。

Added(CLI 侧,锚 IC 电源旗也守「电上地下」)

  • relayout 收尾把锚 IC 的横躺电源/地旗竖直化(用户点名:外围都守约定,中心 器件不能例外)。安全判:竖直桩不穿本件相邻 pin(列顶电源脚/列底地脚才安全), 不安全的保持横躺并报告。横躺判据用旗自身 rot(0/180=竖直)而非 pin→锚 方向——L 形合流树(pin 横引再竖下挂旗)的竖直旗按方向近似会被误判横躺、 重连拆散合流(实测 U2 双 GND 合流被误报)。

Added(CLI 侧,sch zone relayout —— placement-first 区级重排,用户点名的正确顺序)

  • 新命令 sch zone relayout --zone X [--apply]:与 zone tidy(挪带线的组) 的根本差别是顺序——①锚 IC 定位定向(V1 不动)→ ②外围器件按角色纯计算 终局(去耦竖放锚右同顶等距 60、信号链横放其下同行基线共线、链宽按 pin 实测 +网名估)→ ③deep sweep 删净旧桩旗 → 逐件落位 → 一遍性重连(真值表)。 全程不搬带线的图元,组刚移的 merge 撕裂整类问题不存在。ceshi MCU 区实测: 任意乱局一条命令到终局,自检绿,gate PASS。
  • buildTidyPlan 加 forceAll(全员出计划,幂等 no-op 不短路);tidySignalPlan 加 HasPose(signal 件执行时先落位再重连)。
  • zoneTidyGrowBand 双序生长:生长顺序决定 L 形空间里矩形的形状(先纵后横 把下方长满、右缘被低处图签卡死只剩 404 宽;先横后纵长到 806)。两种顺序都 算取面积大者;relayout 的 band 无条件生长(分区 rect 是「当前内容」的函数, 不生长就是鸡生蛋——上轮排成一列,band 缩窄,这轮还是一列)。

Added(CLI 侧,signal-row 链端电源旗竖直化)

  • group tidy signal-row 升级:链末端横躺的 power/gnd netflag(left/right) 一律重连竖直(power 上/gnd 下)——横躺旗的文字竖排侧向渲染(平台特性), 用户点名三处「文字竖着难看」;竖直化后与去耦列同款风格。已竖直 = no-op。
  • 修 signal-row 重建覆盖缺口:deep sweep 删的是全件的树(两端),但重建 计划只含被修 pin——netport 端删了没重建 → 悬空(实测 C5/R1/R2 三件同炸)。 现在有任何修复目标时全部 netport pin 都进重建计划(已水平的按原语义重建)。
  • staging park 位从带右外 +200 改 +500(出纸):+200 曾把组 park 进右邻 功能区腹地(band 右外 ≠ 空地),park 桩与邻区线共点 merge 出跨区短路且回滚 撕裂扩散到邻区(实测两次,第二次伤到 POWER 的 C3)。纸外无内容可 merge。

Added(CLI 侧,zone tidy 行内电气基线对齐)

  • 横放信号链行内基线共线:行内对齐从「组 bbox 顶」改为「电气基线」(器件 锚 y = 桩线 y;行首组定行基线,后续组共线)。bbox 顶对齐时两组上伸量不同 (GND 旗符号 vs 3V3 旗文字)会让同行两条链的走线错开 5-10 单位(用户点名 「横竖不齐」第三轮)。竖放组不变(总高已统一,顶齐即底齐);sheet 层无基线, 行为不变。

[0.24.5] - 2026-08-12

Fixed

  • wire-crossing 对平台合并线(segment-array)的伪交叉误报:collectWireSegments 把段数组当折线读,在无关段端点之间捏造对角伪段——4 段正交 GND 合流树被报 「自己跟自己交叉」(伪对角中点)。与 0.24.1 dangling 修复同款解析:偶数顶点 ≥4 按段对(stride 4),奇数回退折线(stride 2)。wire-over-pin 同管道受益。

Added(CLI 侧,check 补两个视觉盲区判据——用户第二轮肉眼抓出)

  • reversed-net-flag:netflag 的 stored rotation 与桩线方向按 orientation 真值表不符(倒挂/侧翻)→ WARN。此前朝向判据只活在 layout-score(非门), gate 的 check 关抓不到反旗;Go 侧表与 orientation.json 的一致性单测钉死 (再分叉 = 再度双盲)。现场首跑即抓到 EPAD 的 GND 倒挂旗(块 wiring 老表遗毒)。
  • marker-overlap 文字带建模:平台 getPrimitivesBBox 只包旗符号本体(实测 GND 旗 10×21,"GND" 文字不在内)——两支旗符号相切、文字互叠时 overlap=0 静默(U2 双 GND pin 挤成一坨、POWER 区 U1 左三支旗互叠共 4 处全漏)。netflag 判定 bbox 现 = 符号 ∪ 文字带(位置按朝向:水平旗文字在锚内侧线上方,竖旗 文字在符号外端居中;宽 6/字符)。现场首跑抓全 4 处。

[0.24.4] - 2026-08-12

Fixed

  • 竖直旗 rotation 真值修正(2026-06-29 校准错了两个月):当时把 cycle 方向 搞反、用 anchor 对调补救——水平值恰好凑对,竖直值一直反(connect_pin 放的 朝上 3V3 存 180 渲染倒挂,而 linter 用同一份错表把它判「正确」——生成侧和 校验侧共享同一个错,机械门全绿、视觉不合格,用户肉眼抓出)。五点真机实测 (power up=0/right=270/left=90,ground down=0/left=270)确认逆时针 cycle up→left→down→right + 自然锚 {power:up, ground:down, port:right} 复现全部 12 个数;相对旧表只有 up/down 翻转,left/right 逐字节不变。orientation.json (SSOT)/actions.ts/linter fixtures+goldens 三处同步,derive 一致性单测护住。

Added(CLI 侧,竖放视觉规整)

  • 竖放去耦统一总高:group tidy 的 power-updown 桩长按 pin 距补偿 (offset=(100−pin距)/2)——同排组高不一(块 wiring 桩 30 vs autoconnect 默认 桩 20)顶对齐后底不齐。现在同排竖放组顶线/底线双齐。
  • 竖放桶行内间距 40:竖放组左右无标签文字,117(相向水平标签安全距)的 语义不适用,排出来松散。

Added(CLI 侧,zone tidy 组间布局细化)

  • 同形态分桶分行:竖放组(双电源旗去耦,上电下地)与横放组(带 netport 的 信号链,netport 只能水平)不再按面积混排一行——桶切换强制换行,竖的一排、 横的一排(用户点名「横着和竖着不规范」;混排顶对齐后高矮参差)。
  • 移动次序依赖排序:组 i 的目标位压着未移组 j 的原位 → j 先走(Kahn, 有环带外 staging 两跳)。平台会把暂态叠位的共点线 MERGE 成一根,之后再移 就撕出短路(实测:C5 落到未搬走的 R2 原位,EN/IO0 树合并 multi-net,回滚 更撕成同点双 netport)。
  • 回滚后强制复检 bridge-check:回滚也是刚移,merge 过的线逆移同样撕—— 红则大字报「板已受损+修复路径」,不再静默留坏板(此前提示人工复核,实测 漏过一次坏板直到下轮 gate 才发现)。
  • zone 方位词 left-center/center-right/any 同步进 internal/spec.ZoneNames (契约侧;跨包一致性单测抓出的分叉)。

[0.24.3] - 2026-08-12

Fixed

  • bridge-check orphan-stub 误报 pin-to-pin 直连线:无标线树只要触及 ≥2 个 不同器件 pin 就是合法直连(网得自动名如 $2N1792),不再报 orphan——只有 真·单 pin 空桩才是 dangling(实测:LED 直连线替换相向 netport 对后被误伤, sch gate --strict 因此挂红)。

Added(CLI 侧,Sheet 层 + 布局算法通用化)

  • sch sheet tidy Sheet 层布局:全部功能区当刚体依据纸张排布(shelf 行排, 图签当障碍物右跳避让 = L 形可用区,非整条底带让位);band 按分区框最终 占位收缩(内容外 pad 24 + 标题带 30),区间 vGap 默认 90(两框 pad+标题带 =78,+缝 12);现状已达标时幂等 no-op;--apply 逐区 zone move + 统一重画框。
  • zone tidy band 自动生长:区带装不下时向纸面空地四向夹逼生长(避开其他 分区+图签+纸边,只长不缩)——区带锁死旧分区 rect 会把「区内容要长大」判成 无解(超高模组锚在 326 高旧带里永远装不下)。
  • zone pack 策略 B(锚侧行排):锚下装不下时其余组行排到锚右侧子带—— 40 脚模组这类「超高锚」吃满带高时,去耦/外围贴芯片侧是电气+几何双正确形状。
  • zone 方位词新增 left-center / center-right / any:跨两列的宽区 (超高主控锚+侧排外围)原有 1/3 网格词罩不住,逐件 zone-violation 误报。

[0.24.2] - 2026-08-12

Fixed

  • group.move 搬迁平台合并线(segment-array)时崩溃:平台会把共端点同网线 合并为一条 line=(x1,y1,x2,y2)×N 的多段图元,原样喂回 create() 被拒——旧线 已删、新线没建,组半搬(实测 sheet tidy 首跑 MCU 区在 LED_CTRL 三段合并线上 阵亡)。现按段拆成 N 次单段 create(平台自行再合并),0 长度填充段跳过, 分段失败报出已建段数。

Added(CLI 侧,三层布局体系 —— docs/schematic-layout-hierarchy.md)

  • sch group tidy 组内布局计算:双电源旗电容自动竖放+上电下地+文字朝外 (真机校准 rotation 表:power up=0/gnd down=0);实测 pin 旋转二义消解、 stale 双读防线、未建模第三连接拒绝(3-pin 馈通不被扯断)、disconnect 连带 断开即错、自检红即逐步回滚。
  • sch zone move 功能区整体刚移(带组带件带 note,分区框自动重画): 全区一份展开治"区内直连线被判跨区留守"的刚体撕裂;重画前几何指纹 settle。
  • sch zone tidy 组间叠加布局:锚组+上下堆叠(hGap=117 可调),装不下 给最小尺寸诊断;双认领图元差集过滤(正向/回滚对称)。
  • 三命令均经独立交叉评审(2 FAIL 修复转绿 + 1 PASS 加固)与 ceshi 真机三层 联动验收(乱排→tidy 复原/整区 move 单程 check 0 dangling/装不下诊断)。

[0.24.1] - 2026-08-12

Fixed

  • dangling 检测对平台合并线(segment-array)误报:自由端 = 线段图的度 1 顶点(偶数 ≥4 顶点按线段对解析,奇数回退折线链;闭环退化取首尾)——此前 把多段合并线当折线读,3 段 L 形合并线的中间顶点被误判成自由端。

[0.24.0] - 2026-08-12

原理图能力大版:持久化编组 + 布局质量打分 + CLI 参数收敛(含 BREAKING)。 连接器侧含 0.23.1–0.23.3 的全部修复(见下)加本版的 group.move flag 支持与 schematic.snapshot 移除;CLI 侧新增见 repo commit 历史(feat/sch-zoned-layout-opt)。

Added

  • 原理图持久化编组(virtual group):sch group create/list/add/remove/ungroup 按 documentUuid 持久化(平台无编组 API,真机探测+UI 实建 Group1 差分复核: 扩展 API 零可见);sch group-move --group 成员桩线+标志自动展开随组刚移 (完整性预检拒半搬、共线残骸判据、"树终止于异脚"方向判据,live dump 全量 回放测试);align/distribute 部分组硬拒绝(--break-group 放行)。
  • sch layout-score 布局质量五维打分:折叠/反向/贴芯片距离/长链/框贴合, 逐项归因带可执行 fix 命令;模块认领感知(zones claims 围栏)、电源网豁免、 宿主 pin 走导线端点匹配。实战:ceshi 重排 86.2→96.0 [excellent]。
  • sch check 新增机械检查:missing-partition(多器件页未画分区框/说明, 铁律#15 兜底)与 folded-net-label(netport 竖排折叠);autoconnect 打分器 新增竖排折叠惩罚(密集引脚列标签保持水平)。
  • 分区框几何修正:图签 keepout 校准(HeightFrac 0.24)+ 抬升/校验共用安全余量
    • 框贴合模块内容 + 贴边校验,六项 validation 全 0 才许画。

Changed / BREAKING(CLI 与手册配套发版,不留兼容)

  • --ids 全域改 CSV(JSON 数组字符串不再支持);
  • sch delete 移除(prim-delete 唯一删除入口);
  • sch snapshot / schematic.snapshot 移除(出图统一 sch export-image, 选区导出与文档数据逐件核对验证);
  • sch connect 新增 --pin 位号:脚号(与 --x/--y 互斥);sch modify 新增 --x/--y/--rotation/--designator 快捷 flags。

[0.23.3] - 2026-08-12

Fixed

  • schematic.group.move 对 netflag/netport 半途崩溃 —— flag 改走 delete+recreate。 平台 sch_PrimitiveComponent.modify 仅限元件(「仅当器件类型为元件时允许使用该函数 进行修改」),旧实现把 flag 与元件同锅 modify:碰到第一个 flag 即抛错中断,而平台无 事务——此前已 modify 的成员留在新位、其余全没动(live 实测:R1 连续三次半搬、 C5 与全部导线原地不动)。修复:预检阶段先把 wantIds 分类并解析每个 flag 的 recreate 参数(identification/direction 从符号名推:power-/ground-/netport-bi|in|out; net/rotation/mirror 读实例),任一成员不可解析(含 netlabel/short_symbol 无 create API)→ 零变更拒绝;执行阶段元件 modify、flag delete+createNetFlag/Port (rotation 经 appliedRotation 补偿负存储 build)、wire delete+recreate。result 新增 movedFlags。111 单测过。

[0.23.2] - 2026-08-11

  • 版本对齐 bump(hot-reload 部署 0.23.1 修复集时占用的序号),无独立代码变更。

[0.23.1] - 2026-08-11

Fixed

  • sch modify 只 patch 顶层字段(如 supplierId)会把自定义属性整体静默清空(#175)。 根因:平台 eda.sch_PrimitiveComponent.modify 对 otherProperty 是整体重写 语义 —— patch 不带 otherProperty 时平台直接把现有自定义属性清成空,而 handler 只在 patch 含 customAttributes/otherProperty 时才做 read-merge-write,顶层字段 补丁原样透传 → 166 件填好的 Value 被一条 {"supplierId":"C..."} 全清成 ""、 ok=true 零告警(CLI 文档承诺的 MERGE 语义只兑现了一半)。修复:顶层字段补丁 同样先回读现有 otherProperty 并在同一次 modify 里原样写回;全保住时 result.propertiesPreserved + propertiesBefore 显式回报被连带重写的键,平台仍 丢的键走 partial:true + notApplied(CLI 非零退出)绝不静默;现有属性为空则不 加 otherProperty 键(不做无谓整体写,避开 attrs_backfill 记录过的投影键副作用)。 验证:单测把平台整体重写语义建进 stub(不带 otherProperty ⇒ 清空)+ 4 个新用例 (保留写回 / 空属性不写 / 平台仍丢键报 partial / 回读失败降级 verified:false), 连接器 111 单测全过、tsc --noEmit 干净。
  • export-image 后编辑器残留「卡在 99%」进度条 —— 导出完成后主动 teardown。 根因:导出走 sch_ManufactureData.getExportDocumentFile(唯一的矢量+选区+后台 出图路径,无替代 API),该制造数据管线会弹 BOM/器件库进度条,且成功返回后 平台不销毁它——命令 2-3s 成功、文件正常,但 GUI 的 99% toast 挂着要手动关 (实测 2/2 复现)。修复:schematicExportImage 的导出 finally 里延迟 400ms best-effort 调 sys_LoadingAndProgressBar.destroyProgressBar()/destroyLoading() (@public 幂等,已 debug exec 真机验证 showProgressBar(99)→destroy 可清); 成功场景清 99% 残留,超时场景连卡 1% 的一并清。纯 GUI 清理,不改任何输出。
  • 原理图布局「卡进度到 99%」间歇挂死 —— connect_pin 平台变异调用补单步超时。 根因:EasyEDA 平台 API 偶发吞掉创建请求但既不 resolve 也不 reject(与 schematicExportImage 早已用 withTimeout 兜的 SCH_EXPORT「platform drops the request without rejecting → stuck progress toast」同一失效模式)。schematic.power.connect_pin 的三个平台调用(sch_PrimitiveWire.create / createNetFlag / createNetPort)没套超时, 那句 await 就永久挂住;daemon 只能在 ~18s dispatch 预算处以「connector did not respond」 杀掉该请求,于是 block-apply 批量按脚布线时某一脚冻 18s → 用户看到布局进度卡在 ~99% (audit 实测 ≈<1/400 次 connect_pin;挂住的那次有时还迟到落盘留下 $…N… 孤儿网)。修复: 三个变异调用各 withTimeout(7000ms)(远低于 18s dispatch,Promise.resolve 归一重载联合类型), 超时即快速 reject → 流入已有的 wire 重试 / rollback 路径,batch 立即继续、不再冻 18s、不留迟到孤儿。 连接器 107 单测全过。注意:平台偶发假死本身仍在,本修复是把「无限挂死」降级为「快速干净失败可重试」。

[0.23.0] - 2026-08-10

插拔类器件特性版(用户在车机真板复测中逐条点名):打分骂什么、规划器就修什么, 两边口径锁死不分家。全部真机验证(车机 J2 Type-C 从缩板内 129mil → 齐边 → 外突 40.7mil,板 74.0→75.4 [good] 0 blocking)。

Added

  • pcb layout-score --part J2,U1 —— 器件聚焦视角。整体归因是「维→器件」, 用户真实工作流是反向的(整体打分 → 点名要优化的器件):聚焦卡汇总该件的直接 扣分、关联提及(TVS 离 J2 太远,扣的是 TVS 的分但提及 J2 —— 动哪个由人定)、 blocking、几何现状(坐标/装配面/离板边距离)。位号词边界匹配(C1 不误配 C10)。 顺带修掉 --all 的数据层谎言:routable 在 scorer 内截前 12,现在 --all/ --part 时各维保留全量归因。
  • 插接面贴边规则(plug-face-not-flush,edge-io 维)。Type-C/USB/SD/耳机口 (PJ-3xx/3.5mm)类水平插拔件的器件特性:插头从板外水平进入,插接面必须与 板边齐平甚至外突(off-board 判据用焊盘不用 bbox,正是为了放行外突)。 此前 300mil 边带内一律算"在边"——车机 J2 缩板内 129mil 读成无异常,实际 插不了。缩进按深度线性扣(≤25mil 容差齐平,外突负 gap 合法)。
  • 插拔通道禁布(connector-mating-blocked)。内部卧贴插口(FPC/内部 Type-C/ 卡座)开口前方 250mil×口宽的通道里不许压器件 —— 压了插头进不来。开口 方向只认块库 openings 声明(判不了绝不猜);贴边件通道在板外天然免检。 check 规则(WARN)+ edge-io 扣分(归因落遮挡件,每件 10 封顶 30)+ 规划器 T2 落位后把通道登记为占用区(卫星永不被规划进通道)。

Fixed

  • T2 贴边对插拔类器件边距=0 齐平。规划器原统一留 45mil 边距、且 「edgeMargin+30 内算就位」—— 插拔件永远差一截还不被挪(车机 J2 缩板内的 规划侧根因)。插拔类(与 plug-face 规则同一正则)贴边边距=0,就位判据同步收紧。

[0.22.0] - 2026-08-10

PCB 布局能力重构版(#167/#168/#153):多维打分 → 精修 → 确认门的闭环 + 规划器 合法化 + 五块嘉立创开源真板校准。

Added

  • pcb layout-score —— 布局质量九维打分(#167 DETECT 层)。partition/flow-order/ edge-io/protection/tidy/compact/rf/routable/clearance 九维各 0-100 + 逐器件归因 (penalty=「先动谁」),硬错(短路/重叠/出板框)单列 blocking 一票否决不进加权。 三条硬约定:skipped=「没测」≠满分;verdict 单一产出点(计数与判定绝不分家); 归因恒等式 Σpenalty=100−该维分。--spec 解锁 flow-order 与 internal 连接器判定; --from <dump> 离线复现;默认只有 blocking 非零退出(--min-score 显式给才当门)。
  • pcb refine —— 打分驱动的精修环(#167 ACHIEVE 层,#153 护栏)。读逐维归因对 最弱维下确定性变换,每步复核:check finding 上升/分数下降/check 读不到都回滚该步 (逐步回滚,回读证实才算 restored)。默认 dry-run;不可动集合(锁定件+已签字 tier1/2)、位移预算超限剔除不截断。blocking 不归它管 —— 开跑即报 ⛔ 指路。
  • pcb floorplan / easyeda spec validate·show —— S0 spec 类型化(#167 KNOWLEDGE 层)。flow/flowAxis/modules[].kind/interfaces[].{edge,facing,internal,plugWidthMm} 受控词表校验,拼错枚举从静默失灵变 ERROR;floorplan 按 flow 切有序带(只读)。
  • place-constrained 合法化阶段:规划完用 layout-score/lint 同一纯核对虚拟落子 复算 blocking,新引入的重叠/短路/出板框就地螺旋重定位、无解弃子(保原位),弃伙伴 连带弃跟随者(FollowsID 血缘)。落点统一吸 5mil 锚点格。车机真板 benchmark: 规划器首次全面反超人类基线(综合 53.8→64.3,阻塞 1→0,protection +16.9)。
  • 保护件归因对齐:跟随伙伴=打分器同规则选出的端口件(isProtectionIdent/ isPortIdent 共享);伙伴没动就不跟;落点按「离伙伴焊盘更近」双候选择优。
  • #168 两条连接器规则:internal-on-edge / connector-plug-clearance 进 pcb check (+插头护套包络表 _plug_envelope.json),与 edge-io 维共用判定;位号优先于器件名 (USBLC6/SMAJ 不再被误判成连接器)。
  • workflow status 消费质量快照:confirm-layout 落的多维快照渲染 + --reconcile 逐维退化对比(掉 ≥5 分标 ⚠;scored→skipped 报「失去可测性」绝不当 0 分)。
  • 金标准校准体系(#167 LEARNING 层):make layout-calibrate 正负对照 fixture + 五块开源真板入库(实战派ESP32-S3 [maxBlocking=0 旗舰锚点]/庐山派K230/ RK3568四层/MIPI扩展板/BBClaw),好板不掉分+blocking 不误报回归机械可查。
  • pcb.outline.get 返回板框真多边形 points + outlineFormat(#167,连接器侧)。 异形板「到板边距离」不再按 AABB 错算;points=折线中心线(铣刀路径=真板边), bbox 是渲染范围含线宽。多条/含弧退化 bbox 并自述原因(消费方自动回落标 degraded)。

Fixed

  • 五板校准修掉的六处度量失真:渲染 bbox 当 courtyard(实战派S3 曾被误报 104 条 overlap → 重叠/间距改焊盘并集本体代理);圆盘按矩形算(角上假铜误报短路 → 圆-圆/圆-矩真实几何);clearance 阈值拿错规则(4mm 板框类值当装配间距 → >20mil 退回 7.87mil 规范下限)+ 密度归一渐近曲线(好板 86-95,负对照仍必响);同网集堆叠 豁免(装配选项/并联不可能跨网短路);连接器壳下垫件豁免(焊盘不接触只有并集相交); 板框内切割误当外边界护栏(MIPI utilization 曾 1679%)。blocking 误报 267→11, 好板
暂无数据
暂无数据

评论

在登录或注册后才可以进行评论操作
全部评论(1)
按时间排序|按热度排序

类型

Other

关键词

agentautomationwebsocketschematicAI

扩展信息

版本v1.2.10
发布者

zhoushoujian

发布时间2026-08-27 18:32:55
名称

easyeda-agent-connector

UUID

4dae27407c1d43be98e8e210d45fe587

适用EDA版本:~3.2.0
报告

报告滥用

相关链接

主页:https://github.com/zhoushoujianwork/easyeda-agent
反馈:https://github.com/zhoushoujianwork/easyeda-agent
logo

政策条款

服务条款隐私政策项目授权许可协议作出贡献感谢名单

软件版本

专业版标准版教育版私有化部署版

解决方案

专业版编辑器标准版编辑器桌面客户端API接口文档格式

使用帮助

用户论坛专业版教程标准版教程专业版更新标准版更新

关于我们

团队介绍相关报道关于公司联系我们合作联系
EDA公众号
EDA公众号
开源公众号
开源公众号
开源硬件交流群
开源硬件交流群
版权所有 - 深圳创电优选科技有限公司 粤ICP备2026007863号粤公网安备44030402002736号增值电信业务经营许可证粤B2-20201198ISO/IEC隐私政策用户协议