github.com/zhoushoujianwork/easyeda-agent
v1.1.1
#2853 most downloaded on Go modules
zhoushoujianwork/easyeda-agent
What this package is like to depend on
Last release 3 days ago
20 Aug 2026
Ships on a steady schedule
a new release about every 8 days
Nearly every release is documented
notes for 43 of 44 stable releases
Nothing withdrawn
no release was ever pulled
1 months old
63 releases · first in 2026
63 releases in the last 12 months
see the full history below
Release timeline
63 releases · Jun 2026 to Aug 2026Releases
latest 60 of 63-
v1.1.120 Aug 2026Release notes
Open source →[1.1.1] — 2026-08-21
Docs — SKILL.md 顶部写清「这个 skill 单独装上没用」+ 连接器下载地址
从 skill 市场(skillhub / ClawHub)装到这份 skill 的人,拿到的只是指挥说明——
真正干活的是本机easyedaCLI/daemon 和 EasyEDA Pro 里的连接器插件,两个外部件
一个都不能少。此前顶部只在一句话里夹带了插件市场链接,没有可直接照做的安装步骤。现在写成三步:① 一行装 CLI;② 连接器
.eext两个下载入口——立创EDA官方插件市场
(一键装、可原地自动更新,但版本可能滞后 CLI)与 GitHub Release 直下(与 CLI 严格
同版,四件套同版以它为准),并写明「同 uuid 更新必须先卸载旧的、导入后必须完全退出重启
EasyEDA」这两个静默失败点;③ 开「允许外部交互」并用easyeda health验证。CLI / daemon / 连接器行为无改动,纯文档版本。
Already installed? Upgrade in place:
easyeda update # CLI binary (sha256-verified) + skill dirs easyeda update --check # report onlyFirst install:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | shInstalls/updates:
- easyeda CLI/daemon
- easyeda-agent skill for Codex (
/.codex/skills) and/or Claude Code (/.claude/skills) when detected - prints EasyEDA connector .eext import URL
The connector .eext is never auto-updated for sideloads —
easyeda updatereports a stale one and prints the re-import URL.Skill targets: set
EASYEDA_INSTALL_SKILLS=codex,claudeto force targets,noneto skip, orEASYEDA_SKILL_PRESERVE=1to keep local edits.checksums.txtlists sha256 for every asset above.Release notes
Open source →Docs — SKILL.md 顶部写清「这个 skill 单独装上没用」+ 连接器下载地址
从 skill 市场(skillhub / ClawHub)装到这份 skill 的人,拿到的只是指挥说明—— 真正干活的是本机
easyedaCLI/daemon 和 EasyEDA Pro 里的连接器插件,两个外部件 一个都不能少。此前顶部只在一句话里夹带了插件市场链接,没有可直接照做的安装步骤。现在写成三步:① 一行装 CLI;② 连接器
.eext两个下载入口——立创EDA官方插件市场 (一键装、可原地自动更新,但版本可能滞后 CLI)与 GitHub Release 直下(与 CLI 严格 同版,四件套同版以它为准),并写明「同 uuid 更新必须先卸载旧的、导入后必须完全退出重启 EasyEDA」这两个静默失败点;③ 开「允许外部交互」并用easyeda health验证。CLI / daemon / 连接器行为无改动,纯文档版本。
-
v1.1.020 Aug 2026Release notes
Open source →[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/
playbookverify:块)已逐条加上窄到一次调用的放行位,不受影响;而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,与立创插件市场的连接器条目同名。
Already installed? Upgrade in place:
easyeda update # CLI binary (sha256-verified) + skill dirs easyeda update --check # report onlyFirst install:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | shInstalls/updates:
- easyeda CLI/daemon
- easyeda-agent skill for Codex (
/.codex/skills) and/or Claude Code (/.claude/skills) when detected - prints EasyEDA connector .eext import URL
The connector .eext is never auto-updated for sideloads —
easyeda updatereports a stale one and prints the re-import URL.Skill targets: set
EASYEDA_INSTALL_SKILLS=codex,claudeto force targets,noneto skip, orEASYEDA_SKILL_PRESERVE=1to keep local edits.checksums.txtlists sha256 for every asset above.Release notes
Open source →本版把
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/ playbookverify:块)已逐条加上窄到一次调用的放行位,不受影响;而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,与立创插件市场的连接器条目同名。
- 升级后要注意的:布完线直接跑
-
v1.0.3-0.20260818183615-36056214fb4118 Aug 2026 pre-releaseNothing published for this version
-
v1.0.218 Aug 2026Release notes
Open source →[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 列表展开)。
Already installed? Upgrade in place:
easyeda update # CLI binary (sha256-verified) + skill dirs easyeda update --check # report onlyFirst install:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | shInstalls/updates:
- easyeda CLI/daemon
- easyeda-agent skill for Codex (
/.codex/skills) and/or Claude Code (/.claude/skills) when detected - prints EasyEDA connector .eext import URL
The connector .eext is never auto-updated for sideloads —
easyeda updatereports a stale one and prints the re-import URL.Skill targets: set
EASYEDA_INSTALL_SKILLS=codex,claudeto force targets,noneto skip, orEASYEDA_SKILL_PRESERVE=1to keep local edits.checksums.txtlists sha256 for every asset above.Release notes
Open source →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 列表展开)。
-
v1.0.2-0.20260818100717-94c27f42bba718 Aug 2026 pre-releaseNothing published for this version
-
v1.0.118 Aug 2026Release notes
Open source →[1.0.1] - 2026-08-18
连接器侧一条修复(见下);CLI 侧同批落地:artifact 目录递归嵌套归一、
--doc对读命令生效、board.rebind目录补登记(UNKNOWN_ACTION 出口补审计)、
裸sch connect35s 预算 + 慢速落地复核(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;CLIsch disconnect把
partial 渲染为醒目 stderr 警告(不再静默成功)。
Already installed? Upgrade in place:
easyeda update # CLI binary (sha256-verified) + skill dirs easyeda update --check # report onlyFirst install:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | shInstalls/updates:
- easyeda CLI/daemon
- easyeda-agent skill for Codex (
/.codex/skills) and/or Claude Code (/.claude/skills) when detected - prints EasyEDA connector .eext import URL
The connector .eext is never auto-updated for sideloads —
easyeda updatereports a stale one and prints the re-import URL.Skill targets: set
EASYEDA_INSTALL_SKILLS=codex,claudeto force targets,noneto skip, orEASYEDA_SKILL_PRESERVE=1to keep local edits.checksums.txtlists sha256 for every asset above.Release notes
Open source →连接器侧一条修复(见下);CLI 侧同批落地:artifact 目录递归嵌套归一、
--doc对读命令生效、board.rebind目录补登记(UNKNOWN_ACTION 出口补审计)、 裸sch connect35s 预算 + 慢速落地复核(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;CLIsch disconnect把 partial 渲染为醒目 stderr 警告(不再静默成功)。
-
v1.0.017 Aug 2026Release notes
Open source →[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判据需本版连接器才生效。
Already installed? Upgrade in place:
easyeda update # CLI binary (sha256-verified) + skill dirs easyeda update --check # report onlyFirst install:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | shInstalls/updates:
- easyeda CLI/daemon
- easyeda-agent skill for Codex (
/.codex/skills) and/or Claude Code (/.claude/skills) when detected - prints EasyEDA connector .eext import URL
The connector .eext is never auto-updated for sideloads —
easyeda updatereports a stale one and prints the re-import URL.Skill targets: set
EASYEDA_INSTALL_SKILLS=codex,claudeto force targets,noneto skip, orEASYEDA_SKILL_PRESERVE=1to keep local edits.checksums.txtlists sha256 for every asset above.Release notes
Open source →里程碑:原理图功能正式上线(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判据需本版连接器才生效。 -
v0.26.1-0.20260817113301-75a6968f384d17 Aug 2026 pre-releaseNothing published for this version
-
v0.26.017 Aug 2026Release notes
Open source →[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 完全兼容。
Already installed? Upgrade in place:
easyeda update # CLI binary (sha256-verified) + skill dirs easyeda update --check # report onlyFirst install:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | shInstalls/updates:
- easyeda CLI/daemon
- easyeda-agent skill for Codex (
/.codex/skills) and/or Claude Code (/.claude/skills) when detected - prints EasyEDA connector .eext import URL
The connector .eext is never auto-updated for sideloads —
easyeda updatereports a stale one and prints the re-import URL.Skill targets: set
EASYEDA_INSTALL_SKILLS=codex,claudeto force targets,noneto skip, orEASYEDA_SKILL_PRESERVE=1to keep local edits.checksums.txtlists sha256 for every asset above.Release notes
Open source →连接器侧无代码变更 —— 版本号随 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 的编译产物)。
-
v0.25.2-0.20260813071953-6346bd7ced9913 Aug 2026 pre-releaseNothing published for this version
-
v0.25.113 Aug 2026Release notes
Open source →[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不变)。
One-line install/update:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | shInstalls/updates:
- easyeda CLI/daemon
- easyeda-agent skill for Codex (
/.codex/skills) and/or Claude Code (/.claude/skills) when detected - prints EasyEDA connector .eext import URL
Skill targets: set
EASYEDA_INSTALL_SKILLS=codex,claudeto force targets,noneto skip, orEASYEDA_SKILL_PRESERVE=1to keep local edits.Release notes
Open source →修复立创插件市场审核驳回「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不变)。
- README 演示图改用平台图床绝对链接:三张演示图从包内相对路径
-
v0.25.012 Aug 2026Release notes
Open source →[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 层无基线,
行为不变。
One-line install/update:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | shInstalls/updates:
- easyeda CLI/daemon
- easyeda-agent skill for Codex (
/.codex/skills) and/or Claude Code (/.claude/skills) when detected - prints EasyEDA connector .eext import URL
Skill targets: set
EASYEDA_INSTALL_SKILLS=codex,claudeto force targets,noneto skip, orEASYEDA_SKILL_PRESERVE=1to keep local edits.Release notes
Open source →原理图布局体系定版: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 层无基线, 行为不变。
- relayout 识别 pin-to-pin 直连链(如 GND—LED—R—netport):全链共线横放
-
v0.24.1-0.20260812064104-17f49afb293512 Aug 2026 pre-releaseNothing published for this version
-
v0.24.011 Aug 2026Release notes
Open source →[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。
One-line install/update:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | shInstalls/updates:
- easyeda CLI/daemon
- easyeda-agent skill for Codex (
/.codex/skills) and/or Claude Code (/.claude/skills) when detected - prints EasyEDA connector .eext import URL
Skill targets: set
EASYEDA_INSTALL_SKILLS=codex,claudeto force targets,noneto skip, orEASYEDA_SKILL_PRESERVE=1to keep local edits.Release notes
Open source →原理图能力大版:持久化编组 + 布局质量打分 + 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。
- 原理图持久化编组(virtual group):
-
v0.23.1-0.20260810101936-6ca3cf902b6c10 Aug 2026 pre-releaseNothing published for this version
-
v0.23.010 Aug 2026Release notes
Open source →[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,就位判据同步收紧。
One-line install/update:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | shInstalls/updates:
- easyeda CLI/daemon
- easyeda-agent skill for Codex (
/.codex/skills) and/or Claude Code (/.claude/skills) when detected - prints EasyEDA connector .eext import URL
Skill targets: set
EASYEDA_INSTALL_SKILLS=codex,claudeto force targets,noneto skip, orEASYEDA_SKILL_PRESERVE=1to keep local edits.Release notes
Open source →插拔类器件特性版(用户在车机真板复测中逐条点名):打分骂什么、规划器就修什么, 两边口径锁死不分家。全部真机验证(车机 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,就位判据同步收紧。
-
v0.22.009 Aug 2026Release notes
Open source →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, 好板综合分聚拢 59.9~67.7,BBClaw 哨兵全程无误杀。
- refine 环 check 读失败保守回滚:countGateableFindings 返 -1 时旧护栏恒放行, 现按「无法复核=回滚」处理;refine 环本体补 8 个假 daemon E2E(dry-run/apply/ 回滚/回读漂移/tier 保护/中途失败)。
-
v0.21.709 Aug 2026Release notes
Open source →Added
sch note—— 电路说明文本(纯 CLI,zone-draw 同款内部 exec_js 惯例)。 用户反馈:agent 产出的原理图常一页塞满、无分区框、无文字说明,电气对但交付 可读性差。Skill 布局默认升级为「分页分区+电路说明」三件套:S1 分页(每页一个 功能域)、S2 分区框+区名(sch zones set→zone-draw)、S3 每模块 1~3 行电路 说明(sch note --text "LDO: 5V→3V3 1A\n输入/输出各 100nF" --x … --y …,\n换行,字号默认 10/灰色低于区名标签)。创建后回读 primitiveId 验证 + 显式 save;sch text-list枚举、sch prim-delete清理。真机验证(ceshi):多行内容 完整落盘读回。约束落点:SKILL.md 档位默认表+停点② · design-flow S3 过门条件 · schematic-layout-conventions §1.5(含合格说明正反例)。
Fixed
attrs_backfill灌库占位Designator键灭掉全板位号 —— 根因修复(此前误诊为平台行为)。 一块 166 器件的板pcb import-changes后位号 166/166 全变占位符(U?/C?/RF?), 最初归因于平台导入——错。真机控制变量二分(ceshi 六件小板)钉死真凶:裸eda.pcb_Document.importChanges()+ 手动点「应用修改」位号全对(平台无辜,还顺带 给两侧铸造uniqueId);毁位号的是我们自己的pcb.component.attrs_backfill(import-changes 自动跑):器件库记录的 otherProperty 自带Designator: "C?"(库自己的占位位号),merge「填空值」把它灌进实例,平台把 otherProperty.Designator 同步成图元位号 —— 安静板上单独跑一次 sync-attrs 即 100% 复现,与时序无关,每件 变成各自库记录的占位前缀。修法三件套:merge 剔除平台投影键(Designator/Unique ID/Name/Add into BOM/Manufacturer*/Supplier*—— 它们存在 顶层图元状态里,写进 otherProperty 要么被同步成状态(毁位号)要么被静默丢弃(报告 年年撒谎「6/6 backfilled」且永不幂等));同一 modify 显式回传当前位号兜底; 清洗老版本已漏进实例的占位 Designator 键。修后实测:全流程 E2E 位号全真、 sync-attrs 幂等(第二轮 0/6)、真实属性照常回填(Value/Tolerance/Voltage Rating)。pcb.components.list补uniqueId+ CLIpcb sync-designators存量修复。 位号是这套工具链几乎所有规则的输入 —— S0 spec 模块归属、保护件前缀(F*/D*/TVS*)、 去耦判定、pcb check定位、BOM,位号一丢它们不是失灵,而是静默按错误分类算出一份 看着正常的报告。被旧版毁过的板用easyeda pcb sync-designators修:按uniqueId(gge*,平台首次 sch→PCB 导入时铸造、跨文档同一命名空间,实测 166/166 匹配; primitiveId 每个文档各 mint 一套对不上)从原理图回填,只动占位符位号(PCB 手工 设过的真实位号绝不覆盖),每笔写入回读验证(平台 modify 有静默 no-op 前科),修完 立落pcb.save检查点;import-changes之后自动殿后跑(排在 attrs 同步之后, 任何整包 otherProperty 写入若再毁位号都能当场修回),--no-sync-designators可关。 原理图侧位号也是占位符的件单独归类提示「先标注原理图」,不再误报成 unmatched。tagComponentPages页级隔离 + 前台必恢复。此前中途任一页openDocument失败 会整体 abort 且跳过前台恢复 —— 前台留在随机原理图页,随后的 PCB 批量写全落错前台。 现在单页失败只跳过该页,finally无条件恢复调用前的前台文档。pcb.import_changes后续同步只在confirm=applied时执行(CLI 侧)。#124 语义: importChanges 的 promise 会在「确认导入信息」弹框刚打开时就 resolve true ——imported=true不等于器件已落地。此前 CLI 拿它当门,弹框未确认时照跑同步、读到 导入前的板面、静默空跑;现在未确认落地会明确警告并指引手动补跑。
Added
schematic.export.image—— 选区/整页导出 SVG·PNG·PDF(#166)。easyeda sch export-image --ids '[...]' --out block.svg把指定图元单独渲染出来 (自动选中并把画布裁到选区:实测 3 个器件 → 283×155,整页 1191×846),省略--ids导整页;--format svg|png|pdf、--scope selection|page|project、--page、--out。 这是 agent「看局部原理图」的可靠通路 —— 老路子view region+snapshot --no-fit依赖视口重绘,标签页不在前台时 rAF 不触发、画布不重画,于是静默截回上一帧整页 (#166 报的「仍截整页」真因在此,不是 #20 回归);新命令不走视口、不需前台、不弹框, SVG 还是矢量。 ⚠️ 底层getExportDocumentFile的object字面量,官方类型定义三个值全是错的 ('All Schematic'/'Current Schematic'/'Current Schematic Page'),真值是'Current Page'/'Current Page Selected Items'/'Project'(读sch-main.js源码实证)。 传错不报错:内部Z.pureSchematics[<非法key>].sort抛 TypeError、空 reject 无人接, 外层 promise 既不 resolve 也不 reject,编辑器卡在 1% 进度条(实测两次卡死)。 handler 固化真值并加 30s 超时兜底,绝不再让动作队列被悬着的 promise 占死。
-
v0.21.5-0.20260807115932-62a96130029f07 Aug 2026 pre-releaseNothing published for this version
-
v0.21.407 Aug 2026Release notes
Open source →Fixed
- (CLI/daemon)
go test不再把 fixture 写进用户真实审计日志(#159):newAuditWriter("")兜底到~/.easyeda-agent/audit,而 daemon 测试里的New(Options{})都不设AuditDir—— 每个走handleAction的测试都往生产日志 追加假窗口w1/w2、假工程motobox(已污染 33 条,巡检时被当成真实的连日schematic.components.list失败)。新增EASYEDA_AUDIT_DIR覆写(与EASYEDA_WORKFLOW_DIR同款约定,读写两侧同源 ——audit tail/audit export与 skill 的audit-baseline.py都认),并在testing.Testing()下禁用默认 兜底路径:忘了传AuditDir的新测试再也污染不到用户日志(结构性防漏,不靠纪律)。 - (CLI)
waitDocSettle对 PCB 文档不再空转 8s(#161):settle 探针写死schematic.components.list,--page指向 PCB 时探针必然失败,而失败被吞成 「继续轮询」→ 审计日志 21 连发EDA_CALL_FAILED、ready恒 false。现在 探针按文档类型选(pcb→pcb.components.list),守卫下沉到探针本身而不是 指望每个调用方记得判断(doc switch有守卫、switchToPage没有,漏一个就复现); 连续 3 次探针失败即止损。实测 21 连发 → 0,8s → 3.4s。 - (CLI)
sch zone-draw框贴图纸边缘并压标题栏 keep-out(#163):zones 模式在 原始 sheet bbox 上分格且只内缩 4 单位,底排落在标题栏 x 范围内的格直接压进 明细表 —— zone-draw 画的框会触发我们自己的titleblock-overlap规则,而 keep-out 几何一直是现成的(deriveSheetGeometry,partition 模式和sch check都在用), zones 模式只是没消费它。现在先按 margin(默认 20)内缩出可用区再分格,并把与 keep-out 相交的框底边抬到上沿 + 8;标签移入框内不再压框线;收缩后过短的格跳过 不画残条。真机(A4 1170×825 / keepout [468,0→1170,165]):整体由x[4..1166] y[4..821]收到x[24..1146] y[24..801],底排底边 4 → 173,titleblockOverlaps: 0。 errorDetail不再被折叠成[object Object](#160):edaError用String(err)渲染抛出物,平台抛裸对象时根因整条丢失(实测debug.exec_js两条只剩「有个对象」)。而errorDetail存在的唯一理由就是承载eda.*的 原始抛出物(titleblock.modify 0/32 那次复盘只能靠 payload 反推)。新增纯函数describeThrown:Error→message(空则 name)、对象→[code] message | {json}(可读部分在前,截断也留得住)、循环引用标[Circular]、无可枚举属性直说 ——替换actions.ts9 处 +transport.ts1 处同款三元(共享出口覆盖 140 个edaError调用点)。离线单测 10 条。- 原理图图元删除改走
sch_PrimitiveObject,文本删除终于真落盘(#164):sch_PrimitiveText.delete()只从内存/渲染索引摘除,从不进持久化模型 —— 删完 getAll 说没了、save也说没了,doc reload后原 id 全部复活。于是 zone-draw 的「删旧+重画」实为只加不减(车机V2 P5 累积到 56 个标签)。真机定因: 同一次 save 里新建的文本落盘了、删掉的文本回来了 —— 不是没标脏,是 delete 压根没进模型。两处订正原 issue:矩形/导线的 per-class delete 其实是 落盘的(只有文本坏);文本的modify同样被丢弃(改内容 reload 后回退), 等于文本一经创建就冻结。修法=页面图元统一走通用图元类eda.sch_PrimitiveObject.delete(ids),它跨类型且真持久化(混批 6 文本+1 矩形 +1 导线,reload 后全零,连历史遗留的孤儿标签一并清掉);旧平台无此类时回退 per-class。sch zone-draw --clear与创建失败回滚路径同步改走通用类。 schematic.primitives.delete改为回读验证计数(#164):此前deleted[key] = ids.length直接来自请求数,从不回读 —— 与page.clear修过的「把枚举数当删除数报」是同一个坑,只是没修到这里。现在删完重新枚举:deleted/total只计真正消失的,有幸存则按 #151 约定返回partial:true+survived+ warning(画布已变不抛错),CLI 侧sch prim-delete随之非零退出。 同时记一条判据教训:立即回读证明不了持久化 —— 文本删除的立即回读一直 是"已删",zone-draw --clear那套 fail-closed 校验因此报了一路"cleared 6"、 实则 3 个标签全在。凡涉及删除是否落盘,唯一可信判据是doc reload后复查。- 跨页
primitiveId不再被误报「不存在」(#162):getComponentOrThrow只调 活动页作用域的get(),查不到就抛No schematic component found—— 但delete走全页getAll,同一个 id 同一个窗口,replace说找不到、17 秒后delete却删得掉(审计实证:切页后同 id 即成功)。现在 miss 走一次全页判定: 在别页 → 报出它到底在哪页并给easyeda doc switch <page>指引;确实不存在 → 文案明确为「on any page」。收敛 modify / rebind / replace 5 个调用点。 pcb checksilk-over-pad 误报根修(#155):真机裁决 ——pcb silk-align的 落点一直是对的(报告中心 = 实测渲染 bbox 中心,分毫不差),issue 观测的 「实际落点偏左下半文本」是把存储的左下角锚点误读成落点。真凶在 check 侧: silk-over-pad 把 silk.list 的 x/y(左下角锚点)当文本中心用,判定框整体偏移 半个文本 → 对 silk-align 验证过干净的位置误报压焊盘(「换个焊盘继续压」= 判定框 恒在真实文本左下方)。修:pcb.silk.list每条文本附真实渲染 bbox (getPrimitivesBBox),check 直接矩形相交 —— 锚点/字宽/旋转全不用猜;旧连接器 回退近似也改为从锚点正确起箱。真机双向验收:silk-align 摆好 → check 0;故意压 焊盘 → check 1。
Added
schematic.component.resolve_lcsc(#158)—— 确定性「已放置器件→真 C 号」批量解析。 精确匹配链(实例 C 号 → MPN 严格相等 → 工程库名),匹配的封装必须与实例一致 (唯一命中但封装不同 = 封装变体不符,照样 unresolved)——绝不模糊兜底 (真机事故:裸 search("U.FL-R-SMT-1(01)") 的 r[0] 是 C1017 磁珠)。默认 dry-run;apply把 C 号写回 supplierId 非 C 号形状的实例(整板修复一条命令,166 件场景 免手工)。unresolved 附候选;同 MPN+封装缓存。replace/rebind 的身份解析同步加固 (唯一命中也强制封装一致)。CLIeasyeda sch resolve-lcsc [--apply] [--page]。 真机验:坏 supplierId 件 via=mpn 解析+写回,已带真 C 号件 via=instance 不重写。
- (CLI/daemon)
-
v0.21.3-0.20260805090636-b2a4c2bc6ab305 Aug 2026 pre-releaseNothing published for this version
-
v0.21.205 Aug 2026Release notes
Open source →Changed
- 显示名改为 EDA Agent Connector 后重传立创市场(包名与 uuid 均不变)。
按市场管理规范,
displayName去除 "easyeda" 字样;经与市场管理员确认,内部 包名easyeda-agent-connector与 uuid 无需改动,原条目撤销已解除,同一 条目重新上传即可——已装用户的原地自动更新不受影响,无需任何操作。 README(中/英)/包内 README/install.sh 均已附更名说明。
- 显示名改为 EDA Agent Connector 后重传立创市场(包名与 uuid 均不变)。
按市场管理规范,
-
v0.21.2-0.20260804182603-5f5b42572e2004 Aug 2026 pre-releaseNothing published for this version
-
v0.21.104 Aug 2026Release notes
Open source →Fixed
schematic.read的 components 输出漏了primitiveId(真机事故,motobox): read 只输出uniqueId(gge…,sch↔PCB 关联键),agent 抓它当改动句柄喂给 select / delete / modify → 全部 notFound/空选择,看似「任何器件都改不动」。 现在每条 components 带primitiveId(16 位 hex,select/modify/delete/replace/ rebind 的唯一合法句柄),uniqueId 注释明确标注「非 primitiveId」。 真机验:place 返回的 id 与 read 输出一致,按它删除成功。
-
v0.21.004 Aug 2026Release notes
Open source →Added
schematic.component.replace已随 0.20.0 发布;本版补齐它牵出的整条「器件标准化」链路(见下)。pcb.component.attrs_backfill/easyeda pcb sync-attrs—— PCB 器件属性回填: 平台 sch→PCB 导入只搬顶层身份字段,otherProperty 键在值空(Value/耐压/精度/ Datasheet/… 全 ""),PCB 侧器件标准化面板整列空白;且原理图实例的属性值 save/reload 后同样为空(真机实证:place 后即读有值,重开后为空)——原理图不可作 同步源。唯一稳定载体是 device 库记录:按实例 C 号(#157 回填保证是真 C 号)getByLcscIds批量解析,只填 PCB 侧空值键(手改值优先,--overwrite强制), 全程 PCB 前台零切页。pcb import-changes成功后自动跑(--no-sync-attrs关)。 真机验:import 后 PCB 件 Value/耐压/精度/Datasheet 等 9+ 字段从空到齐。schematic.text.list(#156)—— 只读枚举激活页全部文本图元(id/content/x/y/ rotation/fontSize/color),配sch prim-delete --ids清理孤儿 zone-draw 标签, 不再需要debug.exec_js逃生舱。页懒加载定律适用(只见激活页);CLIeasyeda sch text-list [--page <p>]。真机验:建孤儿标签 → text-list 枚举 → prim-delete 清零。
Fixed
- 放置器件 supplierId 默认成 subPartName(
<MPN>.1)而非真 C 号(#157)。 平台sch_PrimitiveComponent.create的原生行为,导致官方「器件标准化」面板全板 标红、BOM Supplier Part 不可下单。现在 place / replace / rebind 重放置后自动从 device 库记录回填真立创 C 号(^C\d+$才写;device 无 C 号的外采占位件不动; 回填失败降级 warning 不阻断)。place 结果新增supplierIdBackfilled字段。 真机验:place C1525 → 实例 supplierId=C1525(此前=CL05B104KO5NNNC.1)。 - rebind(换封装/换符号)对系统库器件从未工作过,现已修复。三层根因真机逐一定位:
① 绑定链用的
getState_Component().uuid是 16 位符号实例 id,lib_Device.modify/create一律拒收 → 复用 replace 的resolvePlacedDeviceIdentity(C 号→MPN→工程库名)解析真 32 位身份;② 系统库 device 记录平台层面只读(32 位 uuid 也 modify=false)→ 新增 个人库克隆回退:复制/复用同名副本 → 副本绑新封装/符号 → 重放置,结果mode='cloned-to-personal-library'+clonedDevice,回滚删副本;③ 克隆的 copy 与 modify 都会弹「符号/封装另存为」冲突框且 promise 挂死到有人点击(#124 家族), 而后台 tab 的 setTimeout 轮询被 Chrome 节流到 ~1次/分 → 改用 MutationObserver 自动点「确认」(默认选项「使用已有的库」即所需语义),护航整个克隆段。 全链 sys_Log 埋点([rebind])可回读诊断;CLI rebind/replace 超时提至 90s (串行库链在线搜索+克隆最坏情况超默认 20s)。ceshi 真机:系统库电容 C0603→C0805 换封装 4.1s 完成,位号保留,弹框自动确认(dialog clicks: 1)。
-
v0.20.004 Aug 2026Release notes
Open source →Added
schematic.component.replace—— 整器件替换(换型号),官方「器件标准化」面板 「使用推荐器件」的 API 等价物(该面板仅暴露打开面板的枚举,零数据/操作 API)。 官方无 rebind-device 原语,走 delete → 同位姿 create → 恢复位号 + uniqueId (保 uniqueId 使 sch→PCB import-changes 走 UPDATE);器件身份字段(name/制造商/ 供应商/LCSC)不带过去,跟新 device 走,keepProperties才连带旧自定义属性。 目标三选一:lcsc(须唯一)/deviceUuid+deviceLibraryUuid/query(须唯一命中); delete 后失败回滚重建原器件(含完整身份)。返回 pinDiff(同位姿按 pinNumber 对比 removed/added/moved)——非空即旧导线对不上,须重接线并sch drc/sch check。 CLI:easyeda sch replace --id <pid> --lcsc C14663。真机验证(ceshi,双向 C14663↔C1525 + same-device 拒绝)并顺带修复两坑:回滚身份不再信 16 位的getState_Component().uuid(resolvePlacedDeviceIdentity走 C 号→MPN+封装名解析 32 位真身份,解析不出动画布前 abort);响应改用 modify 返回的图元序列化 (create 对象立即回读是恢复前的陈旧值)。
Fixed
- manifest 全面去 "easyeda" 字样 —— 治市场下架(管理员原话:「发布者信息和扩展名称
请移除easyeda」)。
publishereasyeda-agent→zhoushoujian;nameeasyeda-agent-connector→eda-agent-connector;displayName→"EDA Agent Connector"; description 与编辑器菜单标题同步改写;仅保留 GitHub 仓库 URL(事实链接)。 uuid 不变,已装用户仍走原地更新;v0.19.0 GitHub Release.eext资产已替换为修正版 (回验:包内除 URL 外 0 处 easyeda 字样)。打包产物文件名随 name 变为eda-agent-connector_v*.eext(Release 资产名保持easyeda-agent-connector.eext不变,install.sh 依赖它)。
-
v0.19.004 Aug 2026Release notes
Open source →🙏 感谢 @NeoSpecies 的 PR #154 —— 首个外部贡献:定位并修复了「同窗口重复激活互踢 socket」的重连风暴,并带来了 MCP stdio 适配层。 本版连接侧的三层修复(activation-scoped id / 失败轮换 / 端口记忆)正是在这个 PR 的基础上叠加完成的。
Added
pcb silk-zone-outline—— 按模块在丝印层画区域轮廓 + 区名标注:读模块内器件的 真实渲染矩形生成正交阶梯包络,避让穿越轮廓的外部器件,自动选不压器件的位置放区名标签。sch gate—— S5 校验门收成一条固定流水线:layout-lint → check → bridge-check → drc按固定顺序跑完出一张报告,verdict 三态(pass/fail/blocked——检查器没跑成 ≠ 板子有 问题,报告直接指向 health/doc 修复而不是让 agent 改电路);每个失败 stage 按实际失败原因 带规定的下一步(blockingReasons),check 的阻塞项直接给规则类型直方图;--json是四个 单命令 JSON 的超集(stages[].detail)。四个单命令保留作局部复查,交付门走 gate。- daemon 对失效 windowId 自动重定向 + 错误分型:页面刷新会换 windowId,旧 id 的调用
此前被误报成
NO_CONNECTOR「没有连接器」。现在 daemon 记住退役窗口的稳定身份 (documentUUID 最强判据/project 兜底),自动路由到接替窗口并在 warnings 里告知新 id; 无法重定向时报STALE_WINDOW(明说连接器是好的,列出在线窗口,建议--project) 或AMBIGUOUS_WINDOW(列候选),NO_CONNECTOR只留给真没连接的情况。 scripts/audit-baseline.py—— 暴露面健康度离线体检:读 audit log 出「调用分布+失败率 / 错路回退 / 逐日多样性」三张表;首测揪出titleblock.modify32 次调用 0 次成功。- 新增本地 stdio MCP 适配层(来自 PR #154,@NeoSpecies):
mcp/将现有easyedaCLI/daemon 的连接健康、action 发现、7 个安全 action domain、电路块和 guarded workflow 暴露为easyeda_*tools。 MCP 不直连 EasyEDA、不绕过 typed action/审计/workflow gate,并明确不暴露任意 JavaScript 的debug.exec_js;mutation 仍要求同时提供 project 与 doc。
Fixed
-
修复 EasyEDA Pro 3.2.175 重复激活同一扩展时的永久重连风暴(来自 PR #154,@NeoSpecies):旧连接器的所有激活 实例共用固定 host WebSocket id,会互相 close/register 同一 socket,表现为交错 heartbeat、 windowId 持续变化、
AMBIGUOUS_PROJECT和 action response 丢失。现在每次激活生成独立 socket id;daemon 仅在 project/document/type/tab 四项完整且完全相同时把连接视为 transport duplicate,并路由到最新连接。真实不同 tab 或身份不完整仍保持 ambiguous,不会静默误路由。 -
连接器卡死后能自己爬回来:扫描连续失败会轮换 websocket id(叠加在同版 activation-scoped id 之上)。
eda.sys_WebSocket.register()在同 id 连接仍被 EasyEDA 视为 "active" 时会静默忽略新的 url/callback(pro-api-typesindex.d.ts:21025)。 activation-scoped id 解决的是「同窗口多激活互踢」,解决不了「本激活自己的 id 被判为 active 后 register 全被忽略」——连续WS_ID_ROTATE_AFTER_FAILED_SCANS(2)轮全端口 扫描失败后换成<base>-r<n>,全新 id 在 EasyEDA 侧没有记录,register 必然生效。 happy path(daemon 在线、首轮即连上)始终用基础 id 不受影响;daemon 真不在时轮换也无副作用。 真机 soak 实测(2026-08-04,web 编辑器;停 daemon 后不关 tab、不 reload,看能否自愈):版本 停 45s 停 60s 停 75s 仅 activation-scoped ✅ 5s ❌ 210s 未自愈 — + 轮换 ✅ 5s ✅ 5s ❌ 120s 未自愈 / 同条件重测 ✅ 90s 两者都只是改善概率,都没根治 —— 真实形态不是「永不恢复」而是「恢复耗时不可预测」 (5s / 90s / 210s+)。根因待查,而排查被下面这条可观测性缺陷挡住。
-
连接器诊断日志此前在最需要时不可见,现改走
eda.sys_Log:diag()原本只经 WebSocket 发给 daemon —— 断线时恰好发不出去,而断线正是唯一需要它的时刻;这正是 重连 bug 长期只能黑盒试的结构性原因。排查中实证了两件事(EasyEDA Pro 3.2.175): ① 扩展里的console.*是死代码 —— 沙箱发给扩展的console每个方法都literally 是()=>{}(经_EXTAPI_SCRIPT_SPACES_[uuid].console.log.toString()验证),所以先前 想补的 console 输出一行也到不了 DevTools;② 沙箱把window/document/localStorage/indexedDB/postMessage一律置为undefined,eda.*是唯一的对外通道。 因此主 sink 改为eda.sys_Log.add():断线时照写、用户在编辑器「日志」面板直接可见、 且eda.sys_Log.sort()可编程读回 —— 这才让离线 soak 变得可诊断。WebSocket 发送保留 为在线路径。同时在每轮扫描起手打scan start session/retryCount/wsId。 首次拿到断线期日志即暴露真问题:一轮全端口扫描要 18 秒(每个端口都死等满CONNECTION_TIMEOUT_MS=1500,说明register()对连不上的端口不回调失败、只能靠 超时兜底),叠加retryCount>5后的 10s 慢重试 → 一个周期 ~28s。这就是「恢复耗时 不可预测」的直接来源,也是下一步要收的口子。 -
重连不再每次都全端口重扫:优先重试上次成功的端口(
scanOrder)。断线期日志显示 一轮全扫要 ~18s,因为eda.sys_WebSocket.register()从不报告"连接被拒",每个空端口 都得烧满CONNECTION_TIMEOUT_MS。而重启的 daemon 实际上总是重新绑到同一个端口 (它按序取范围内第一个空闲端口),所以先试上次成功的端口能把常见重连从「整轮扫描」 变成「一次尝试」。4 个单测钉住顺序、去重、越界历史值与全覆盖。 ⚠️ 同期试过把CONNECTION_TIMEOUT_MS1500→600 加速全扫,实测是负优化并已回退: soak 从45s✅/60s✅/75s❌退到45s✅/60s❌/75s❌,有一轮扫到session=58仍未重连。 更快的扫描 = 单位时间内 close()/register() 循环翻倍,而REGISTER_DELAY_MS那 200ms 的 id 释放窗口本就紧张 —— 瓶颈是 EasyEDA 那张共享 socket 表的状态机,不是延迟, 加速只会喂大它输掉的那场竞争。理由已写进常量注释,免得下次有人再"优化"一遍。 -
sch gate真机验出的三个报告缺陷已修:strict 档下 summary 缺判据字段导致「全 0 却 FAIL」自相矛盾;blocker 从 error 计数拼出「0 个阻塞项」却判失败;建议按 stage 名给, 0 bridge 却教「拆真短路」。现在 status/blocker 均由具名blockingReasons决定,建议按 失败原因关键词匹配,绝不把 agent 指向板子没有的问题。 -
schematic.titleblock.modify从「32 次调用 0 次成功」修到有回读验证 —— 这条是 audit log 离线体检(scripts/audit-baseline.py)抓出来的:该 action 历史上被调用 32 次, 成功 0 次,却一直挂在 skill 文档里。根因不在我们的调用姿势,而在旧实现直接透传平台的ok:官方 @beta remarks 原文写着「任何无法识别的明细项将被忽略」且「如若存在无法识别的 明细项但程序并未出错,将返回true的结果」——这个 API 对写不进去的字段报成功,与 「删除 API 撒谎」同族。于是「改了个根本不存在的明细项」会被报成功,而真正抛错的那 20 次 (payload 是拿Size/Width/Height/Page Size当纸张属性写)既无法证伪也说不出原因。 现在走 #151 的三态契约:改前快照 → 写 → 回读逐项比对,产出applied/alreadySet/notApplied/unknownKeys。全部落空 ⇒ ERROR(附「先跑 titleblock-get 看可用 key」的指路); 部分落空 ⇒partial:true+ warnings + CLI 非零退出(已写进画布的子集是既成事实,ok:true让 autosave 照常落盘);回读不可用 ⇒verified:false而绝不降级成ok:false。alreadySet(改前就等于期望值)不计入applied、也不豁免全失败硬门。unknownKeys是本 action 特有的诊断:那些根本不是明细项,修法是换 key 而不是重试—— 明细表改不了纸张尺寸。SDK 显式返回false也不再被吞。9 个单测覆盖上述每一条。 -
audit log 记录
errorDetail—— 协议Error.Detail(连接器捕获的平台原始报错)此前 被丢弃,日志里只剩我们自己的包装文案(如 "Failed to modify schematic page title block."), 事后定位根因无从谈起:上面那条 titleblock 的调查只能从 payload 反推。现在原始错误一并落盘。
-
v0.18.301 Aug 2026Release notes
Open source →Added
pcb layout-lint新增跨网短路检测(shortERROR)—— 从「靠太近」升级到「这两网短路」: 两器件 bbox 相交时进一步比焊盘铜皮矩形,若两块铜在共享层上真的压在一起且分属不同 网络,报ERROR short C2.1[VBAT_RAW] ↔ D2.2[SW1_NODE]—— 与 KiCad 的shorting_items对齐(此前同一份数据上 KiCad 定性成短路,我们只报几何重叠)。short 与 overlap 同级致命 (ok=false、score 归零、verdictshort、--gate直接失败)。短路按焊盘层判而不是装配面: 两个异面 SMD 焊盘永不短路,但通孔焊盘(层 12=multi)贯穿所有层,能跟对面焊盘真短 —— 这是唯一不吃「同面才比」规则的地方。焊盘取不到尺寸(多边形焊盘)或无网络时跳过而不猜。 与下面的层感知一样没有用到新 API,现有pcb.components.list --include-pads的数据就够算。
Fixed
pcb layout-lint的 overlap 判定不再「层盲」,双面贴片板上的数字终于可信:它比的是 不分层的渲染 bbox 两两相交,于是顶层器件与底层器件落在同一 XY 也被判成 overlap, 而那在物理上是完全合法的顶底对穿。真实案例:box-v2 rev-a(166 器件 / 642 焊盘,85×45mm 四层双面贴片)跑出 116 条 overlap,人工按层分组重算的真值是 0,该项目 README 只能 专门写一段警告绕开这个数字。对照实验(本机 KiCad 10.0.1 实跑):两个C_0805放完全相同的 XY、一个 F.Cu 一个 B.Cu,kicad-cli pcb drc报 0 violations —— KiCad 比的是分层的 courtyard(F.CrtYd/B.CrtYd),天生按层分组。现在器件按装配面(pcb.components.list本就返回的layer,1=顶 2=底)分组后才两两比,overlap / tight spacing / 手焊烙铁通道 三项同改(底面邻居堵不住顶面的烙铁);未知面(layer缺失)保守地与两面都比,缺字段永远 不会掩盖真重叠。每条 finding 带side,报告头带sides分布(如[bottom 134 / top 32])。 同板复跑:overlap 116 → 0、tight 7 → 3,与人工重算真值一致。- 安装脚本撞上 GitHub API 限流时不再只丢一句
Could not determine latest release version:install.sh解析 latest release 走匿名api.github.com(每 IP 每小时 60 次), 公司出口 / NAT / CI 很容易撞满并拿到403。现在(1)有 token 就带上 —— 依次取GITHUB_TOKEN/GH_TOKEN,都没有则回落到已登录的gh auth token;(2)新增EASYEDA_VERSION=<tag>直接锁版本、完全跳过 API 查询(裸0.18.2会自动补v); (3)失败信息可执行 —— 403/429 明确说是限流并给出「设 token /gh auth login」与 「EASYEDA_VERSION=<tag>」两条出路,401(token 失效)、404(无 latest release)、 网络不可达也各有独立提示。README(中/英)与docs/quick-start.md同步补充。
-
v0.18.229 Jul 2026Release notes
Open source →Fixed
- 安装脚本更新 skill 不再产生
.bak备份、污染 skills 目录:install.sh的install_skill_to从「先mv成easyeda-agent.bak.<时间戳>再拷新版本」改为 干净替换——检测到本地 skill 与 release 不一致时直接rm -rf旧目录再cp新版本, 不再在~/.claude/skills/~/.codex/skills下留一堆过期备份副本(备份目录会被 skill 加载器扫到、误加载旧内容)。需要保留本地改动的用户仍可用EASYEDA_SKILL_PRESERVE=1跳过覆盖。 - 多页原理图功能框/标题不再串页或只留内存:
sch zones认领与 fixed/partition/ autolayout 三条绘框路径统一按 documentUuid 持久化(旧schZones/单 frame 记录仍可读); fixed 模式开放--font-size(默认 14pt)。重画/清除会回读 rectangle/text ID,任何 survivor 都失败并保留恢复记录;创建数量须 1:1,部分创建自清理;成功画/清均显式校验schematic.save(saved:true),避免孤儿文本和跨页误删。
- 安装脚本更新 skill 不再产生
-
v0.18.1-0.20260722161206-016244c8e3d722 Jul 2026 pre-releaseNothing published for this version
-
v0.18.022 Jul 2026Release notes
Open source →Added —
sch check三条几何 marker 规则 (issue #146/#147/#148)- 电气检查(连接器
schematicCheck)看不见纯几何缺陷。新增三条 Go 侧规则,消费components.list --include-bbox已流入的真实 bbox/锚点(零连接器改动、纯离线单测可验收):duplicate-net-marker(#146):同类型+同网+量化锚点的重合 netflag/netport ≥2 报 WARN, finding 带全部primitiveIds+suggestKeepId/suggestDeleteIds,直接喂sch prim-delete; 量化容忍 1384.9999 类浮点漂移,跨页/跨网/跨类型不误合并。titleblock-overlap(#147):part/marker bbox 正面积侵入 A4 图签 keep-out。marker-overlap(#148):marker×part / marker×marker 正面积相交(part×part 是 layout-lint 的活),--overlap-eps调噪声下限(默认 0.5),抑制已被 duplicate 规则报过的重合对。 真机验证:ceshi P1 真实板报出 28 组 marker 重叠(含平行同侧端口 31×1 天然相交)。
Added — 数据驱动 A4 分区规划器
sch zone-plan/zone-draw --mode partition(issue #149)- 固定九宫格
zoneRect表达不了「按整纸切功能区 + 右下图签留缺口」的行业版式。新 planner 从活体几何求解:usable sheet(减 margin)按模块 bbox 之间的自然空隙切列/行分割线 (edge-gap 而非中心 midpoint——高模块跨过中心线会跑出分区;空隙需 ≥ gutter),每个分区抬到 图签 keep-out 之上、顶部留 title band 放大字号区名。模块 bbox =sch zones认领各件 live bbox 并集。zone-plan --json落盘前出方案 + validation 五项(sheetOverflow/partitionOverlap/ titleBlockHits/moduleOutsideZone/labelCollisions)。partition frame id 按 documentUuid 分页 持久化(SchZoneFrameIdsByPage,逐页 redraw/clear 不串页)。真机 validation 全 0 + 落笔 bbox 与 plan 一致。纯函数planPartitions用 issue 真实 6 模块 A4 数据单测。
Fixed — autoconnect 标题栏硬约束 + 创建后兜底 + partial + 真实尺寸 stagger (issue #146/#147/#148)
- 标题栏软惩罚→硬拒绝(#147):
scoreCandidate里图签命中从costTitleBlock=10000改costHardReject,四方向全进图签时明确失败,否则主动转向安全方向(不再把 netport 落进明细表)。 - 创建后真实 bbox 兜底(#147 DoD2):批量后回读真实 bbox,凡侵入图签 keep-out 的 marker 连 wire 一并删除并判失败——绝不「返回成功且图签上留 marker」。
- partial 报告(#146):
acReport加partial/succeeded/failed,批量中断后只补失败 pin, 不重放整份 spec(避免在已连 pin 上叠重复标识)。 - 真实尺寸 stagger(#148 Phase-2):打分用的
labelBox从固定 8×8 换成贴近实测的 marker 框 (~24×11);旧 8×8 在 10-pitch 平行脚永不与邻居相交、stagger 从不触发,真实 11-高框相交 → 规划器自动挑不同 offset 错开。真机 ch340c:相邻 GND 脚 offset 交替 18/36,marker-overlap 24-28→9。
Fixed — A4 图签 keep-out 只圈住右半的根因 + A4 优先标定
- 根因:
deriveSheetGeometry的 A4 横版比例只有{0.22,0.14}→ keep-out(912.6,0)..(1170,115.5)只覆盖图签右半的日期列,左半(原理图/Schematic1/Board1/ceshi)全露在外。所有吃这个 keep-out 的检查(#147 硬拒绝/门、#149 分区抬升、#141 避让)一致误报「0 覆盖」而真实图签左半持续被压。 - 真机 overlay 标定实测真实图签 ≈ 宽 60%×高 20%,改
{0.6,0.2}→(468,0)..(1170,165)完整框住整表。 - A4 优先:图签是定尺寸表格不随页面等比缩放,故该比例只对 A4 准。新增
isA4LandscapeSize, 非 A4 A 系列横版(A3+)仍给 best-effort keep-out 但降级source:fallback-ratio+ warn「calibrated for A4 landscape only」,让非 A4 的 keep-out 永不被当硬门静默信任。
Fixed — 批量删除静默失效:
sch clear一直在谎报清空- 根因是平台的
eda.sch_Primitive*.delete(ids)在大批量上静默 no-op 并返回true。 实测同一页:1/5/20/50 个 → 全删掉;58 个 → 全删掉;134 个一次调用 → 一个没删,返回值照样true。 是尺寸上限而非「某个图元删不掉」——那次失败的 134 里剩下的 58 个单独删就干净。 schematic.page.clear此前把「枚举到 N 个」当成「删除了 N 个」上报:一次 232 图元的 clear 报total: 232成功,实际只删掉 5 个、227 个存活。调用方合理地把成功读成「页面已空」, 于是一个逐块回归脚本在 clear 之间静默累积了三个块的元件,污染了整轮测量数据。- 三处修复:①
deleteSchGroup分批 50/批(clear 与所有图元类删除共用); ②schematic.page.clear改为 delete→重新枚举→循环收敛(上限 6 轮,无进展即停), 并诚实上报enumerated/total(真正消失的数量)/remaining/passes,没清干净时带 warning; ③schematic.component.delete同样分批,并回读校验,返回requested/removed/survived而不是那个会撒谎的布尔。真机验证:538 图元一次 clear →passes: 1, remaining: 0。 - 通用教训:平台的删除类 API 返回值不可信,批量操作后必须回读确认。
Added —
sch extract-layout反向导出块模板 (issue #140)easyeda sch extract-layout <block-id>:block-apply 模板步骤的逆操作——读活动页上一个摆好的 块实例,按每个 role 的实测 anchor + rotation 反算出块的schematic_layout模板(role→{dx,dy,rotation}, 相对确定性锚点,自动吸 5 格、rotation 归一到 {0,90,180,270})。把「在真板上把外设摆漂亮一次→固化模板」 从肉眼盯板手写 dx/dy 变成数据管线(20 块里 18 块还缺模板就是因为纯手工)。两个设计决策确定性落定: ① role→designator 用--role ROLE=DESIG显式(优先)+--from D1,D2,…按唯一前缀自动匹配,歧义/未命中 直接报错绝不瞎猜;② 锚点=按 role 名排序后首个前缀为 "U"(芯片/MCU)的 role,否则排序首个 role,重复导出稳定不漂。 v1 只 PRINT 模板 JSON 供复审(不写回 go:embed 数据——回写要保 JSON 键序,Go map 序列化会打乱全部键→不可读 diff), 复审后粘进internal/blocks/data/<id>.json再跑go test ./internal/blocks/...过全 role 覆盖 + on-grid + 合法 rotation 校验。纯函数单测覆盖(前缀提取/rotation 归一/role 反查歧义与缺失/相对偏移计算);--write就地回写待 保序写入器就位后加。真机 extract→回写→新页 block-apply→layout-lint 一致性待活体编辑器验收。
Added — 分区自动画框接入自动放置流程 (issue #142)
sch autolayout --engine template --apply落完自动zone-draw:此前功能分区可视化 (虚线区域框+区名)是sch zones set+sch zone-draw两步手动跟进;现在模板引擎--apply成功后,按--spec的modules[].zone自动持久化分区认领(SetSchZones,sch zones status/ layout-lint 可见)并用与 zone-violation 同一zoneRect几何画出区域框+区名——「先看区、 再看线」成为放置流程一等公民。复用既有buildZoneDrawJS,frame primitive id 记入 workflow state,sch zone-draw --clear精确移除、不碰用户图形。新 flag--zone-draw(默认开,--zone-draw=false关闭);无 sheet bbox / 无 zoned module 时静默跳过,best-effort 不影响布局。 纯函数单测覆盖(TestBuildAutolayoutZoneClaims);真机「多块页自动出现分区框」待活体编辑器验收。 block-apply 的 category→zone 自动分区 + 去耦分组文本注释(需先定 category→zone 映射/default_zone方案)留作后续,不在本次范围。
Fixed —
--engine official兜底增强 (issue #143)connect_pin网格判定容忍浮点残差:吸附把件 anchor 修到整 5 格,但引脚坐标 = anchor + 旋转偏移,旋转数学引入 FP 噪声(引脚落 649.9999999 而非 650),旧的严格相等网格判定把合法引脚 误判为 off-grid 而拒连(官方--rewire残留 ~7 条失败连接)。现引入GRID_EPS=0.01:先 round 到最近格、与网格点距离 <0.01 即视为 on-grid;并把桩的引脚侧顶点吸到整格(pinGX/pinGY),使 短桩真正轴对齐(0.0001 的斜桩会让 flag 悬空/EasyEDA 拒建)同时仍 <0.01 贴合真实引脚→照常连通。GRID_EPS远 < 半格,真正 off-grid(半格 2.5)仍正确拒绝。顺带修好offset==0重叠检查(旧逻辑 在 FP 引脚下漏判)。- 官方
autoLayout喂designatorDeviceTypeMap:此前裸调无参;现从页面真实位号前缀分类 (R→resistor / C→capacitor / L·FB→inductive / D·LED→diode / Q→triode / Y·X→oscillator / U·IC→chip / 其余→otherDevice)构建 designator→type map 注入,官方算法按角色更聚拢地摆放。空 map 降级为裸调;传多余 props 对忽略它的旧构建无害。Go 单测覆盖分类器 + map 构建;真机连通率/布局效果 待活体编辑器验收。
Fixed — block-apply 消费标题栏 keep-out (issue #141)
sch block-apply原点避碰纳入 A4 标题栏图签:此前bapResolveOrigin只把已有器件的 真实 bbox 当障碍,块落在纸面偏右下会压到 A4 右下角图签/明细表。现在从bapResolveOrigin的同一次components.list(includeBBox)里顺手取"sheet"bbox,复用titleBlockKeepout(autoconnect/autolayout 共用的 keep-out 单一几何源)派生标题栏矩形,追加进螺旋找空位的障碍集 ——不显式--at时自动避开图签;显式--at仍尊重坐标但碰撞(器件或图签)会 warn。无 sheet bbox 时降级为不强制(与其它调用方一致)。纯函数单测覆盖(TestPlanBlockApplyOriginDodgesTitleBlock/…ExplicitAtOverTitleBlock);真机 0-overlap 且块 bbox 不与图签相交待活体编辑器验收。
- 电气检查(连接器
-
v0.17.1-0.20260721104035-a3aff5636f4321 Jul 2026 pre-releaseNothing published for this version
-
v0.17.021 Jul 2026Release notes
Open source →Added — PCB SVG 丝印导入 (issue #139)
pcb.silk.import_svg/pcb silk-import-svg:把 SVG(LOGO / 品牌标 / 图形)作为填充 丝印图元导入(eda.pcb_PrimitiveImage.create)——无需debug.exec_js的 typed 路径。新增 Go 侧 SVG 解析器internal/pcb/svgimport:解析 path(M/L/H/V/C/S/Q/T/A/Z)、polygon/polyline/rect/circle/ellipse/line、嵌套transform、viewBox,曲线全部扁平化为线段, 输出 EDA 复杂多边形命令数组(轮廓 + even-odd 挖孔,LOGO 的孔洞如 "o" 中空自动镂空)。 Flag:--file/--svg、--x/--y(或--at)=图形左上角、--width/--height/--keep-aspect、--layer(3 顶 / 4 底自动镜像)、--rotation/--mirror,以及--dry-run(CLI 侧,打印目标 bbox / 轮廓数 / 顶点数 / 最小特征 + 低于--min-line-width≈6mil 的 DFM 告警)。ceshi 真机验证: 顶/底丝印可建、孔洞镂空、旋转+镜像生效、扛过doc reload+pcb save(同 primitiveId/bbox)、pcb check干净。关键判据:pcb_PrimitiveImage直接吃丝印层的复杂多边形,填充 LOGO 无需描边化 或光栅化(推翻初始范围风险)。填充规则为 even-odd,纯描边图形按填充处理。星火计划 LOGO 品牌素材 示例待授权确认(下载链接 + SHA-256,不再分发)。
-
v0.16.020 Jul 2026Release notes
Open source →Added — 原理图放置方法论(一套自己的摆放方法)
- 块
schematic_layout模板:电路块 JSON 新增schematic_layout(role →{dx,dy,rotation}相对坐标模板,y-UP、5 格对齐、须覆盖全部 role,schema +go test双校验)。sch block-apply优先按模板落件(去耦贴电源脚一字排开/上拉靠引脚/晶振·FLASH 分列,信号流左入右出,人审一次 终身复用),无模板才退回网格;原点自动避碰(不显式--at时按已有器件真实 bbox 螺旋找空位)、 落后回读真实 bbox 把 overlap 写进 manifest。esp32s3r8_chip_minsys / led_indicator_gpio 首批带模板。 sch zones功能分区认领 +layout-lintzone-violation:S0 spec 的modules[].zone持久化,sch layout-lint新增"认领件落在分区矩形外"的 WARN(与 PCB zones 独立)。sch zone-draw分区框可视化:把认领画成虚线区域框 + 区名文本(eda.sch_PrimitiveRectangle/Text), 与 zone-violation 同一几何,所见即所校验;--clear精确移除,不碰用户图形。sch align/sch distribute:按真实渲染 bbox 对齐(left/right/top/bottom/centerx/centery)/ 等距摊开,默认 dry-run、--apply落地自检;补齐 design-flow S6 一直引用却不存在的命令。sch autolayout --engine official官方 autoLayout 兜底引擎:包装平台eda.sch_Document.autoLayout()(@beta,3.2.148 起可用)。它对已连线页是破坏性的(移件不移线 → 断线、落 off-grid),故加安全管线: 已连线守卫(无--rewire拒绝)、跑后吸附 5 格、--rewire(跑前捕获网表 → autoLayout → 吸附 → 删断线 → 重连)、自检用sch check(查断线)不止layout-lint(查重叠)。定位:模板未命中页的兜底起点。
Added — 机制
--doc <uuid|name>全局 flag:根治 doc-switch racing。所有命令默认对"当前前台文档"操作而doc switch异步,长命令(autoLayout ~2min)/跨命令时前台漂移会把编辑落到错误的页。--doc在postAction咽喉点加守卫:变更动作(catalogMutates)落地前ensureActiveDoc切目标页并用实时document.current确认(不看缓存 /health),确认不了拒绝而非编辑错页;导航动作豁免防递归。 真机验证:前台停 P2 时block-apply --doc P1稳稳落 P1、P2 不动。多页/长操作一律带--doc。
Fixed
- 原理图坐标系 y-UP 定音:双探针文本实测 3.2.148 画布为 y-UP(y 大=视觉上方),修正
zoneRect的 top/bottom 映射(此前按 y-DOWN 写反,autolayout/zone-violation/zone-draw 上下翻转)、标题栏 keep-out 锚点(此前保护右上角,实际标题栏在右下)、sch align --mode top/bottom语义。
- 块
-
v0.14.2-0.20260719083708-638ccaaa699f19 Jul 2026 pre-releaseNothing published for this version
-
v0.14.119 Jul 2026Release notes
Open source →Fixed
schematic.pin.set_no_connect真正生成非连接 X 标识(订正 0.5.14 的平台 no-op 误诊): 真机复现确认setState_NoConnected(...)只修改当前 pin 句柄的待提交状态,必须再await pin.done()才会写回画布;此前 handler 漏掉done(),fresh readback 因而恢复false,被误判成 EasyEDA Pro 3.2.x 平台限制。现在改走sch_PrimitiveComponent.get(id) → component.getAllPins(),逐脚 setter +done(),再用 新器件实例回读验证。Pro 3.2.149 真机已确认绿色 X 出现、noConnected:true,且sch check的 floating-pin 计数同步减少;--clear同路径持久化清除。 (#133 Bug 3 / #134, 感谢 @zhiqiangme 贡献)- skill 脚本 Windows 中文环境 GBK 解码崩溃(#133 Bug 4):bulk-connect /
bulk-place / sch / diff 四脚本的
subprocess.run显式encoding='utf-8', errors='replace'——CLI 输出恒为 UTF-8,此前text=True在 Windows 中文环境 按系统 GBK 解码,器件描述含中文时UnicodeDecodeError崩溃。 - 文档:environment-setup.md 新增 PowerShell 5.1 吞 JSON 参数双引号的说明
与绕行(
--%/ 反引号转义 / CSV 形式 / PowerShell 7+)(#133 Bug 5)。
-
v0.14.1-0.20260717164530-40534cd1044f17 Jul 2026 pre-releaseNothing published for this version
-
v0.14.017 Jul 2026Release notes
Open source →「真机可信化」版:一天内 16 个 issue 闭环的集中发布。三大主题: ① via/导入可信化——EPAD 内嵌热过孔的删除欺骗与赋网易失被彻底摸清(删不掉: 假成功+立即 getAll 也骗+reload 原 id 复活;赋网只活到 reload),
pcb.route.delete前置拒删、pcb.add_component放置即键合、CLI 新增pcb via-bond幂等重键合 +pcb checknetless-via-in-pad 触发器;import-changes 十七天误诊破案——它从来 不是 no-op,是「确认导入信息」对话框没人点,现在 handler 自动点「应用修改」, clear→reimport 往返打通。② 布线器硬否决——异网走线/slot 从代价升级为 hopFeasible 硬门(R2 两条真交叉短路的根治),mount-holes 反查既有铜皮。 ③ 门禁与工具诚实化——power-not-poured 对 GND 内电层死锁解除(PlanePouredNets 状态互通)、--force分级放行(零确认机械骨架要--force-unsafe)、pcb clear默认 verify 复合流程、高 pin 连接器不再抢 main、陶瓷贴片天线 keepout、 根级easyeda health别名。Fixed
pcb.import_changes假 no-op 根因修复(#124,订正 #20 诊断):importChanges 一直 都能正确算出变更清单——它弹「确认导入信息」对话框等人点「应用修改」,API 返回 true 只 代表对话框弹出;headless 没人点,看起来就是静默 no-op(「不支持增量导入」是误诊)。 真机实证:点击后 20 件全部落板。handler 现在自动等待对话框并点「应用修改」 (confirm:false保留人工审查),且 importChanges 的 promise 不再串行 await (实测某些状态下永不 resolve,会卡死连接器整个动作队列)——改为并发点击 + 12s 超时 兜底,以器件计数差(componentsBefore/After)为落板真值。pcb.route.delete假报成功修复(#120,真机订正):SDK 的delete()对封装内嵌 via(QFN EPAD 热过孔是 component 的一部分)返回true且立即 getAll 也显示已删, 但 save/reload 后从封装定义原 id 复活(ceshi 真机实证)——纯 readback 会被骗。handler 现在前置结构判定:via id 以某器件 primitiveId 为前缀 = 内嵌,直接拒删进notDeletable[](附父器件 + 指引pcb via-bond),ok:false;其余照常删除并 readback 兜底(removed/count只统计真正消失的,不可归因的幸存者进notDeleted)。pcb.add_component内嵌 via 赋网(#118):封装内嵌的 EPAD 热过孔net="", EPAD 永远焊不上 GND 平面且每颗报一条 same-footprint SMD Pad to Via。现在赋完 pad 网后,枚举落在本器件已赋网 pad 铜皮矩形内的无网 via,用pcb_PrimitiveVia.modify(@beta)赋成该 pad 的网,并 readback 验证(#120 教训: SDK 布尔不可信);结果新增embeddedVias {assigned, verified, failed}。 ⚠️ 真机实证:该赋网不能活过 doc reload(平台每次都把内嵌 via 重物化为无网)—— CLI 侧配套pcb via-bond(exec_js 路线,旧连接器即可用)负责 reload 后重键合,pcb check新规则 netless-via-in-pad 是触发器。
-
v0.13.1-0.20260715194641-4481b064f52015 Jul 2026 pre-releaseNothing published for this version
-
v0.13.015 Jul 2026Release notes
Open source →「规范进代码」版:PCB 设计规范从「文档等 AI 自觉去读」变成机器强制——26 条
pcb check规则的报错自带[规范 §N]章节引用、布完线必须过post_route_checked门才能进交付、电源线宽按公制阶梯自动给宽。配套补齐芯片级(ESP32-S3 裸片)选型与电路块, 并新增pcb clear/pcb mount-holes两条命令。Added
pcb.page.clear— 一键整版清空 PCB(easyeda pcb clear),schematic.page.clear的 PCB 对称版。一次删掉所有板级内容:器件 + 布线(轨/弧/过孔)+ 铺铜/填充 + keep-out/规则区域- 自由丝印(丝印层 3/4 的字符串及线/弧图形,不误删铜层文字或机械/装配图元)。
pcb.component.delete只删器件、布线/铺铜会静默残留;这个才是真正的清板重来。 默认保留锁定图元 + 板框(layer 11);--only components,routing,copper,regions,silk收窄、--no-preserve-outline连板框删、--include-locked连锁定件删。--dry-run只统计不删。 复用rip_up的 copper-only 规则,布线永不误伤丝印/板框。无 undo,确认门控。 内部枚举→删除→再枚举循环到 0(上限 5 轮,返回rounds)——首轮枚举可能读到 stale 引擎态漏项(实测 153 轨清完仍剩 8),循环补清等价于用户手工再跑一遍;dry-run 不循环; 撞轮次上限仍有残留则追加 warning 提示 save+reload 再跑,绝不假报干净(#112)。
- 自由丝印(丝印层 3/4 的字符串及线/弧图形,不误删铜层文字或机械/装配图元)。
easyeda pcb mount-holes— 四角 M3 安装孔自动放置(#102):读板框 bbox 四角内缩放孔 (--dia默认 126mil=Ø3.2mm /--inset197mil≈5mm /--corners tl,tr,bl,br子集 /--dry-run)。孔形态 = layer-12 多边形 fill(与pcb slot同原语,零新增 action); keep-out = max(孔半径+40, 垫圈118mil),圆-矩形相交逐角查器件 bbox,冲突警告+跳过, 绝不压件;已有孔报exists(幂等重跑)。post_route_checked阶段门 —— 「布完必查」机械化(#97 续):workflow advance在 布线后自动跑pcb check,ERROR + power-not-poured + width-under-spec 三项清零才放行 丝印/交付;其余 WARN 报告不拦。13 个布线类 action 标InvalidatesStage→ 改线后门 自动重新关上。拒门时逐条打印 blocking finding(自带[规范 §N]引用)。easyeda pcb modify --center(#105):--x/--y解释为期望的 bbox 中心而非器件 锚点(锚点常偏中心,实测 ESP32 模组偏 135mil,旋转件更甚);pcb list --include-bbox输出注入center字段。默认语义不变。pcb fill create --at x,y --size w,h别名(#109):消除--rect= 两角点的歧义。- audit 客户端归因 + 并发写 advisory(#108):Request 带
clientId(<hostname>:<pid>[:EASYEDA_CLIENT_LABEL]),audit JSONL 每行可归因;不同会话 10 分钟内 写同一板 → 响应附concurrentWriter警告(不阻断,CLI 打 stderr)。 staleRiskadvisory —— 铁律 5 机械化:PCB mutation 后未doc reload就读/DRC → daemon 在响应附警告(CLI stderr),pour-rebuild/reload 后自动解除。- 芯片级(ESP32-S3 裸片)物料链:
standard-parts.json补 6 类选型(#106,S3R8 裸片 C2913194 内封 8MB PSRAM / W25Q64 / APS6404L / 40MHz 晶振 / 2.4G 陶瓷天线 / π 匹配); 电路块库新增 2 个 draft 块block.esp32s3r8_chip_minsys+block.ant_2g4_ceramic_pi(共 23 块:20 ready / 3 draft)。 pcb.components.list --include-pads返回焊盘真实铜皮width/height、pcb.silk.list返回fontSize(0.12.1 起):clearance/DFM/避障从名义常量升级实测值。- PCB 设计规范手册(
skills/easyeda-agent/references/pcb-design-rules.md):13 章, JLC 工艺 + IPC-2221;pcb check报错的[规范 §N]即指向此手册章节。 sch bridge-check规则类型化:wire-bridge(ERROR)/orphan-stub(WARN), JSON 可按类型 gate,对齐pcb check强制力。
Changed
pcb check新增 5 条 DFM 规则(共 26 条),全部自带[规范 §N]引用:silk-over-pad(§11.2 丝印压焊盘)、decap-too-far(§3.1 去耦电容离 IC >2.5mm)、via-in-pad(§2.3 同网过孔打在焊盘上)、copper-near-edge(§5.1 铜距板边)、fiducial-missing(§9 SMT 板缺 Mark 点,INFO)。旧的 11 类规则也补上了章节引用。- net-class 线宽阶梯改公制圆整(规范 §1.2):电源分档从 mil 碎值(10/15/20mil = 0.254/0.381/0.508mm)改为公制推荐值 branch 0.25mm / trunk 0.4mm / high-current 0.5mm (9.84/15.75/19.69mil);signal 仍取板的 live 规则值。存量按旧阶梯布的板零追溯告警。
easyeda pcb power-pour:2 层板电源自动铺铜(power-planes的 2 层版)——GND 全板 pour + 各电源轨局部动态 pour(非 static fill,防异网短路)。- 删除类命令统一收 CSV 与 JSON 数组(#109):
pcb delete/pour-delete/region delete/fill delete/track-delete/via-delete——pcb drc --json的objs数组现在可直接粘贴。
Fixed
- clearance 判据改铜皮边缘距:track↔pad / via↔pad 原按径向 max(w,h)/2 判(USB-C 长条 焊盘旁的合法走线被误报 21 条);track↔via / track↔track 原按中心线距判并打印,导致 「runs 16.9mil — under the 6mil rule」自相矛盾文案,且两条 10mil 线中心距 8mil(铜皮 已重叠)竟放行 = 漏报短路。现全部按真实矩形/半宽算边缘距。
- route-short detour 段 fine-pitch 收窄改子段级(#107):原为整 hop 级,任一端点落在 密脚场就把整条多层绕行(含对侧层电源 trunk)连坐收窄到 6mil,载流严重不足。
- workflow 指纹 reload 后误报 placement drift(#100):坐标取整放粗到 1mil + 压平
-0.0、旋转折进 [0,360)、layer 数字与名称统一映射;顺带修掉
asString读数字 layer 恒 空串导致翻面对指纹不可见的隐藏 bug。 place-constrained检测不到 slot 挖的 M3 孔(#104,holes 恒 0 → Tier-1 避让失明): 根因是解析pcb.fill.list的points字段,而连接器只在includeBBox里给几何。via-crosses-plane的「plane 无网」分支降为 INFO(#110):实证 PLANE 层 pour 在doc reload后被装进负片存储、扩展 API 无任何读取路径(平台行为,非本项目 bug), 该分支在 reload 后必然假阳性 → 不再计入 warnings/拦--strict,message 指引以pcb drcConnection=0 为准。pcb.silk_netnames碰撞检测从硬编码 50×50mil 改真实焊盘 extent。--dry-run预览不再被当成 mutation(#112):daemon 侧统一按 payload 的dryRun标志把预览排除出Mutates判定 —— 之前只跑pcb clear --dry-run(不改板)也会 armstaleRisk并触发 autosave;现在 staleRisk / autosave / concurrentWriter 三处一致。workflow advance门失败时非零退出(#113):post_route_checked 拒门(或门跑不起来) 时 exit≠0,脚本set -e/ CI 循环终于拦得住;与既有「阻塞在人工签核时非零」OR 合并。- 门与
power-planes不再自相矛盾(#114):power-planes判定「内层已被占用 → 该网 改走线」(routeAsTracks)的电源网记进 workflow state,post_route_checked 门豁免其power-not-poured(仍打印并标注 exempt)。此前两个工具互相打架:去铺撞已有平面、 不铺过不了门。豁免跟着布局失效(placement_confirmed 及更早)而非布线。 bom export定位bom-enrich.py(#115):六级探测(--script→EASYEDA_SKILLS_DIR→ 已安装 skill 目录(复用skill status同一份逻辑) → 可执行文件兄弟路径 → cwd →$PATH), 非仓库 cwd 下不再找不到;找不到时列出每一条探测过的路径。
-
v0.12.1-0.20260714103559-b1393cfe9f9214 Jul 2026 pre-releaseNothing published for this version
-
v0.12.1-0.20260713182234-db9747d0cfb513 Jul 2026 pre-releaseNothing published for this version
-
v0.12.013 Jul 2026Release notes
Open source →本版把项目工作流机械化(#97)、补上手焊可达门(#99)、让
place-constrained网感知分组连接器,并修掉三处在 esp32Mini 端到端回归里暴露的工具张力(Type-C 突出板框、 beautify 圆角与pcb check的弧不感知)。Added
- 项目 design-flow 状态机机械强制(#97):新增
easyeda workflow(init / status / advance / confirm / reset)——6 段门(imported→placement_ready→placement_confirmed→ outline_confirmed→pre_route_passed→routing_authorized)。daemon 在/action层拦截 未授权布线(pcb.line.create/pcb.via.create/pcb.import_autoroute,fail-closed); 布局/朝向类 action 携带指纹,任何 mutation 自动失效下游确认并全链回退。 - 手焊铁路门(#99):
pcb layout-lint --gate增加手焊可达检查——每个器件至少一侧有 ≥60mil 净通道(否则「四面被围」判 fail);配pcb stage set-assembly hand-solder落盘的装配档(min-gap 40 / large-pad 60)。 pcb.line.list返回 copper 弧(arcs):与lines并列返回圆弧图元的端点,向后兼容 (旧 CLI 忽略新字段)。让 headless 检查能把「track 端接在弧端点」识别为已连,而非悬空。
Changed
place-constrained网感知分组:edge="user-facing"的连接器(USB / SD / 端子 / 排针) 分组到同一条共享边并沿边紧凑排布;共享边由网感知选(贴连接器电气搭档主芯片的那条边, 经共享 local 网,而非几何质心)——USB 贴 CH340 同侧,缩短差分对、少交叉(实测同种子 61→28 交叉)。edge="any"(RF/模组)保持各自最近边。
Fixed
layout-lintoff-board 改按焊盘中心判:连接器身/courtyard 突出板框(Type-C mating 面、 卡座、螺钉端子)但焊盘全在框内属有意贴边,不再误判 off-board、不再卡死 confirm-layout 授权链;无焊盘件兜底 bbox(焊盘边到板框净空仍归 DRC)。pcb check弧感知(消除 beautify 圆角伪报):beautify把拐角圆化成 track→arc→track 后,dangling-end与floating-track-island两个检测因不认弧而爆假阳性(实测一块板 dangling 0→130、island 0→10,而官方 DRC 报 0 断)。现dangling-end认「同层弧端点=track 端已连」、floating-track-island用弧桥接 union(镜像过孔桥接)——实测两者双双归零。
- 项目 design-flow 状态机机械强制(#97):新增
-
v0.11.311 Jul 2026Release notes
Open source →守护进程端口稳定性(补丁):
Fixed
- 多 daemon 抢端口根治:daemon 改为单一固定端口 49620(不再顺移到 49621…)。旧行为下
第二个
daemon start会悄悄占下一个端口,而连接器扫整段 49620–49629 会在多个 daemon 间抖 (陈年make dev/air 实例的典型症状);旧 PID 文件兜底不可靠。新的ensurePortAvailable: 空闲→绑;被我方 daemon 占(/health探测确认)→自动替换(端口级,可靠);被别的 程序占→交互终端问[y/N]、headless(air/nohup 无 TTY)报清晰错误退出——绝不静默杀外部 进程。连接器侧不用改(仍扫 49620–49629,先命中 49620)。
- 多 daemon 抢端口根治:daemon 改为单一固定端口 49620(不再顺移到 49621…)。旧行为下
第二个
-
v0.11.211 Jul 2026Release notes
Open source →本版聚焦 PCB 布局智能 与 电路块库扩张,并将连接器上架官方插件市场。
Added
- 电路块库扩张(~15 个新拓扑块 + 两批器件入库):sy8089 3V3 同步 buck、tps63802 buck-boost、usbc_ufp_power_or(USB-C 设备口 + VBUS 二极管 OR)、ch334f USB2.0 四口 hub、 bq24074 power-path 充电、vehicle_input 车载 12–24V 前端 + tps54360 车规 buck、 pmos_highside 高侧软启动、opto_acc_ign 车载 ACC/点火检测、axp2101 PMU 等。
easyeda pcb antenna-keepout(新命令):按块声明(keepout.end_frac)自动为 RF/天线器件在每个铜层(MULTI 层)生成 no-copper 禁铜区——只盖模组无焊盘的天线端 (不孤立接地焊盘)、幂等;--dry-run/--pad-clearance。- 边缘端子自动定向:块声明连接器开口方向(
openings:[{match,local}]),pcb place-constrained据此把螺钉端子等开口自动转向板外;焊盘对称且块未声明的 连接器则显式提示手工确认(不凭焊盘几何乱猜)。 - 连接器上架立创EDA官方插件市场
—— 新增市场一键安装通道,平台可原地自动更新;侧载 GitHub Release
.eext仍与 CLI 严格同版,是四件套对齐的权威来源(市场版本可能滞后 CLI,每次发版需网页端手动重新提审)。
Changed / Fixed — PCB 布局智能(place-constrained 大修)
- 器件分类改消费块 placement 数据(位号前缀)而非硬编码正则 + 新增显式
anchor档; 分类字符串改用真manufacturerId而非"={Manufacturer Part}"模板(修 WROOM 被误判为 主芯片、连接器按名认不出)。 - 边缘吸附读真板框(
pcb.outline.get)而非件云 bbox;Tier-4 卫星按共网聚类到 所属芯片(优先局部信号网)。 - 对抗审查修 6 个潜在 bug:天线 keepout 不再压焊盘(
--pad-clearance让开焊盘本体)、 块_doc键不再丢整块 placement、天线幂等收紧(只认 MULTI 层全铜禁铜)、netSeed 优先 局部网、天线器件识别在pcb check与生成器两侧对齐。
Verified
go test ./...全绿;ceshi 真机逐条验证(WROOM 模组main→edge、J1 螺钉端子开口 朝外、天线 keepoutpcb checkloop 0→1→0);两轮多 agent 对抗审查复核 5 个 review 修复 (0 新增回归)。
-
v0.11.010 Jul 2026Release notes
Open source →功能版本(minor):PCB 走线美化
easyeda pcb beautify上线——吸收自开源扩展m-RNA/Easy_EDA_PCB_Beautify(Apache-2.0),补齐布线定稿后的美化后处理档,接在 design-flow P7.9(P7 布线之后、 P8 铺铜/出 Gerber 之前)。Added
easyeda pcb beautify— 走线美化(拐角圆弧化):新 typed actionpcb.beautify。 把已布好的直角/锐角铜走线圆滑成圆弧(改善美观 + 可制造性,减少尖角蚀刻风险)。--scope all|selected(默认 all)/--net/--layer过滤;--selected只处理 EasyEDA 里框选的走线。- 拐角圆弧化:把同网同层相接的线段串成多段线,每个内拐角按
--radius-ratio(默认 3,半径=最大线宽×3)生成 fillet 圆弧,替换原线段为「截断直线 + 圆弧」。 - 差分/等长同心圆弧:成对/等长网的拐角走同心圆弧保护——feature-detect
pcb_Drc.getAllDifferentialPairs/getAllEqualLengthNetGroups,该 build 无此 API 时降级为保直角(不阻断)。--no-protect关闭。 - 自带安全网:美化会 delete 原线段 + create line/arc,故内建 DRC 二分修复
(
--drc-retry,默认 4:缩半径或退回直角修违规拐角)+ 自动重铺覆铜(同网 GND 键合会 stale,复用pour-rebuild)。--no-drc/--no-pour-rebuild可关。 --dry-run:只计算规划(paths / lines / arcs)、不动板——可在任意真实板上 安全预览。只处理铜层,绝不碰丝印/板框,跳过锁定铜。- 其它:
--force-arc(线段太短也生成截断圆弧)、--merge-u(紧凑 U 型弯合并为 单个大圆弧)。
- 几何库移植:
extension/src/beautify/{math,arcGeometry,drc}.ts从上游纯几何 verbatim 移植(无 eda.* 依赖),index.ts为 headless 编排(去掉上游自研快照/撤销 与 iframe 设置面板,改 payload 驱动、结果结构化返回)。 - 接入两个上游 DRC API:
pcb_Drc.getAllDifferentialPairs/getAllEqualLengthNetGroups(差分对/等长组读取)。
Docs
references/design-flow.md新增 P7.9 走线美化档(dry-run 先行 + 上游告警清单: 焊盘-走线连接需人工复核、RF/高速网排除全局美化、出 Gerber 前预览);references/pcb.md加pcb beautify命令条目;docs/ecosystem-survey.md/docs/marketplace-coverage.mdabsorb-list 标记已吸收(#1c)。- 署名:新增仓库根
NOTICE,记录 Apache-2.0 第三方来源、原作者 m-RNA、逐文件 映射与相对上游的改动;几何文件头保留出处注释。
Known limitations
- 线宽贝塞尔平滑(上游 widthTransition)本版未移植——follow-up。
- 运行时已核:
pcb_PrimitiveArc.create在当前 web build 确认落笔提交(ceshi 真机 探针:create→getAll 命中→delete 净零还原,err:null);此前route-short --corner round的「native arc 不提交」笔记指的是 outline 的 MathPolygon 分段弧,与 primitive arc 无关。整链路端到端(路径链接/DRC 二分/重铺)首用建议仍在 ceshi 跑一遍确认。
-
v0.10.010 Jul 2026Release notes
Open source →功能版本(minor):电路块库
easyeda blocks上线——从「器件→块→流程」三层 库的拓扑层落地为可离线查询的旗舰能力,配套 skill 自动同步、PCB 引脚级丝印批注、 整板批量落图脚本与切页竞态收口。Added
-
easyeda blocks— 离线电路块库查询(embedded):ls/show <id>/search <query>,块库 JSON 用go:embed编进二进制,零 daemon / 零窗口 / 零 skill 文件——异地/裸机easyeda安装即可查已验证外设电路(CH340/自动下载/ buck/RS485/CC1101/microSD…),不必下载 GitHub 库。skill 的references/blocks/*.json仍是社区源(PR 进这里),make sync-blocks构建前拷进internal/blocks/data/再 embed;internal/blocks带漂移守卫测试(embed 副本 ≠ skill 源即 CI 失败)。 本次同时从 case001 提炼 4 新块入库(XL1509 buck / SP3485 RS485 / CC1101 巴伦 / microSD),再补最小系统 3 块(AMS1117 LDO 5→3.3 / BOOT+RESET 按键 / GPIO LED 指示), 块库达 10 ready——esp32MiniRequire 最小系统已 100% 块覆盖(模组+CH340+自动下载+ LDO+按键+LED)。 -
Skill 目录自动同步 + 连接器落后提示(免手动升级):
daemon start默认带--auto-update-skill,启动时后台把已存在的 skill 目录(~/.claude、~/.codex) 拉齐到最新 release 并逐步打日志(尊重EASYEDA_SKILL_PRESERVE)。新增easyeda skill status/easyeda skill sync(--version/--preserve/--client/--create-missing/--json)手动查看与触发同一机制。连接器一注册即比对版本,落后 时打可操作日志(重导.eext+ 彻底重启 EasyEDA)——sideload.eext无原地 自动更新(市场专属能力),故只检测+提示、不静默替换。install.sh 装完 skill 写.version标记与 daemon 对齐避免重复下载。连接器代码未变,升级无需重导.eext。 -
PCB 丝印批量标注:
pcb silk-netnames(pcb.silk.netnames)按矩形区域为网络 名自动生成免碰撞丝印;pcb silk-label-pads(pcb.silk.label_pads)为器件焊盘按 引脚号/网络名批量标注,支持 X/Y 轴贴齐(--align-axis)与朝向自动判定,便于给 排针/连接器逐脚标功能。 -
easyeda doc open <name|uuid>:doc switch的语义化别名(open 一个文档), 与doc ls/switch/reload风格一致。 -
整板批量落图脚本:
scripts/bulk-place.py(manifest→放置+位号回写)与scripts/bulk-connect.py(连接 spec→autoconnect+期望网表验证门+悬空脚修复循环), 沉淀自 box-v2 139 件整板实测;references/auto-layout-sop.md补 5 条实测经验 (netport-first、引脚重合盲区、切页 settle 竞态、check 裸对象信封、验证门)。
Fixed
- 切页竞态收口(#67):
document.open/schematic.page.open现在在返回前 轮询活动页器件数直到 settle(连续两次相同即视为装载完成,0 → N的装载中态 不会被误判为空页),并在 result 中带ready:true/false。修复「doc switch返回成功后立即sch check拿到空 findings、隔 2-4 秒才完整」的问题。PCB 无 components 可轮询,乐观返回ready:true。
-
-
v0.9.1-0.20260708185150-505e833d2eae08 Jul 2026 pre-releaseNothing published for this version
-
v0.9.008 Jul 2026Release notes
Open source →自 0.8.3 以来的整体收口版本:PCB 布线/DRC 从「能放」走到「能连、能查、能救」, 原理图从零建图闭环幂等化,并沉淀了「抄官方板 → 自主设计」的训练方法论与 ADR-0002 前置设计交互。以下按主题汇总 0.8.4–0.8.13 各 dev 迭代的用户可见变化 (逐条明细见下方各历史条目)。
Added
- PCB 布线手术刀 + 换层跳线:
pcb.route.delete(按 primitiveId 精准删 track/arc/via,rip_up 不再整网重铺)、pcb.route.via_hop(入口 stub→via→对层 track→via→出口 stub 的复合换层,默认两层各放同网键合 fill 桥接 track↔via 裸结点)、pcb.route.route_short多层布线(长/跨层 hop 用 via 换层,不再全推迷宫档)。 - headless DRC 盲区补齐:
pcb check新增通用间距规则(抓导线短接)、via-bond (ERROR:track↔via 裸结点未被键合 fill 覆盖)、floating-track-island、dangling-end (面积锚定)、缝合过孔间距、挖槽/过孔间距感知;pcb drc支持--json/--timeout- daemon 侧防重入。DRC 实测 66→31、Connection 9→0。
- 单网内电层:同一 GND 网可独占内电层填充(via-stitch → pour)。
- 原理图分组与断连:
sch group-move(器件+周边 stub 导线/flag 刚性整体平移, 无状态虚拟分组)、schematic.pin.disconnect支持pinX+pinY坐标定位。 sch autoplace-free:零区域自动布局,把件塞进纸面空白处。- 标准器件库扩充:芯片级设计 11 件 + case001 通用料 24 件(
references/standard-parts.json)。 pcb.silk.label_pads新增alignAxis/--align-axis参数:可选择按 X 轴或 Y 轴贴齐标注(x/y/auto),并在结果中返回align_axis_chosen。适合排针/连接器 等不同朝向封装,让丝印标注沿焊盘阵列形成整齐队列。
Changed
sch autoconnect幂等化(issue #50):components.list --include-pins的每个 pin 附带权威网表来源的net字段,autoconnect 据此三态判定 pin 是否已连目标网, 重跑不再叠加 flag。- Skill 方法论沉淀:ADR-0002 前置设计方案书(S0)+ 三档交互模式(决策交互化、 执行自动化);紧凑布局设为默认 + 手工修线三律;官方板对标 §7.8–7.9 地策略选择判据 (单 GND→双 PLANE;多地域→全 SIGNAL 分区 pour);抄图训练闭环(XDS110 174/174 pin 一致 + 多页拆分)固化为验收方法。
Fixed
sch page.rename写后自校验(issue #55):改名后doc ls读到旧页名 → 短间隔 重试读回确认,命中verified:true,超时如实返回verified:false+warning。--all-pages非激活页壳数据告警(issue #54):sch read/list/check/layout-lint对非激活页如实警告 pins/bbox 可能为空,layout-lint把 skip 升为醒目 WARN。sch checkgeom-net-mismatch 对 netflag/netport 静音:designator 为空的原语 网表交叉校验静音,几何单独判(64/64 误报→0)。sch autolayout锚点 snap 到 5 网格:分区居中产出的分数坐标(206.25)不再致 connect_pin 批量失败;connect_pin引脚离网格时快速失败给可行动报错。- lib search 对 LCSC C 号精确匹配:不再模糊命中错料。
- PCB 布线手术刀 + 换层跳线:
-
v0.8.4-0.20260707161416-2428bba5c46e07 Jul 2026 pre-releaseNothing published for this version
-
v0.8.4-0.20260706120918-484ce29439df06 Jul 2026 pre-releaseNothing published for this version
-
v0.8.306 Jul 2026Release notes
Open source →Typed PCB layer/view switching for bottom-side visual QA (#40) + release-flow ClawHub integration. Connector code changed (
extension/src/actions.ts) — this release requires a connector re-import (uninstall old → import new .eext → fully quit & relaunch EasyEDA). Version 0.8.2 is skipped: it was burned on ClawHub by a stale-content skill upload (clawhub workdir trap; versions are immutable there), so 0.8.3 keeps CLI/connector/skill aligned.Added
- Typed PCB layer/view actions (no more manual UI clicks for bottom-side
checks):
pcb.layers.set_current(pcb layer-set, accepts id|name|top|bottom|inner1),pcb.layers.visibility(pcb layer-visibility, presets top-only|bottom-only|copper-only|silk-only or explicit show/hide),pcb.view.side(pcb view-side) — selects the side's copper and focuses its copper/silk layers so the next snapshot reflects that side. No native canvas flip API exists, so view-side is a layer-focus approximation, not a physical board flip. make releasenow publishes the skill to ClawHub at the same version (best-effort — a hub failure doesn't block the release; retry withmake publish-skill VERSION=…). Uses an absolute path to dodge the clawhub global-workdir trap.
Fixed
currentLayer:nullreadback (#40) —pcb.layers.listnow activates the PCB tab beforegetCurrentLayerand returnsvisibleLayersas display-state evidence whencurrentLayeris empty.- README install commands — removed the non-working skillhub.cn CLI command
(web-only community, no
/api/cli/v1endpoint); ClawHub + GitHub Releaseskills.tar.gzare the supported skill-install paths.
- Typed PCB layer/view actions (no more manual UI clicks for bottom-side
checks):
-
v0.8.104 Jul 2026Release notes
Open source →Fresh-PCB pour-reflow fix, solidified end to end (root cause pinned → commands → playbook → fresh-board replay-verified: DRC 55 → 1). Go/CLI only — no connector code change, no re-import needed.
Root cause pinned: a PCB document created in the current session and never reloaded computes pour reflow from a creation-time rules snapshot — rule writes (readback shows them),
pour-rebuild, and tab-switching have NO effect until the document is really closed and reopened; already-reloaded documents honor rule writes immediately. On top of that, the fresh-board reflow runs ~3% under the configured clearance (10mil → ~9.7mil) and skips thermal spokes (suspected platform issue, to be reported upstream).Added
easyeda doc reload [name|uuid]— save + close + reopen a document (a real reload;doc switchonly changes the foreground tab). Refreshes the per-document reflow rules snapshot; runpcb pour-rebuildafter reloading a PCB. Saves first (typedschematic.save/pcb.saveby document type), so no edits are lost.easyeda pcb drc-rules-set --pour-clearance <mil>— the write side ofdrc-rules(v1 knob: pour/plane copper clearance, raise-only — never loosens a stricter board). PatchesPlanelineClearance(copperRegion both pad models + innerPlane) of the current rule configuration, writes it back (bare-config API shape — the{name, config}wrapper silently no-ops), verifies by re-read; a write on a system preset turns it into a per-board 自定义配置 copy, as the platform requires.- esp32-mini playbook:
rules-pour-margin+reload-pcb+pour-rebuild-2steps (182→186) — margin 10→12mil before pouring, then a document reload + second rebuild after, so a replay on a freshly created PCB passes DRC directly. Verified end to end on a fresh board (ceshi/Board4): 47 + 186 steps green, official DRC = 1 (the known #33 add-component netlist false positive).
-
v0.8.003 Jul 2026Release notes
Open source →Recording/demo-mode reliability — a one-call stage capture that gates on the frame, plus blank-frame detection — and a netless-pour cleanup, on top of the accumulated connector fixes.
Added
easyeda pcb stage-snapshot --stage "…"— one-call recording/demo STAGE capture: native PCB snapshot + a data bundle (components/tracks/vias/pours/nets/drc)- a
stage.jsonmanifest, GATED on the frame — a BLANK / STALE / wrong-document (foreground tab not a PCB) capture exits non-zero, so aset -erecording script halts instead of banking a bad frame. Go/CLI only, no re-import.
- a
- Blank-frame detection on
pcb/sch snapshot. The capture reads the FOREGROUND tab's rendered canvas, which comes back BLANK when the window isn't visibly rendering (minimized / backgrounded). The CLI decodes the PNG and WARNs on a blank frame — distinct from a STALE (byte-identical) one. Verified: no API call (view fit / zoom / ratline / openDocument / tab-switch) repaints a hidden window; the only fix is bringing EasyEDA to the foreground. Go/CLI only. easyeda pcb pour-clean --netless [--dry-run]— remove copper pours bound to no net (dead copper thatpour-fit --replacecan't clear — it only matches same-net pours). Surfaced by the newpcb checknetless-pour rule. Go/CLI only. (#34)easyeda debug exec --timeout <sec>— override the 20s round-trip default for slow eda.* calls (e.g.sch_Netlist.getNetlist(), which can loop >90s on a schematic with floating pins — prefergetNetlistFile(), whichsch readuses and never hangs). Go/CLI only, no re-import.
Fixed
connect_pin/sch autoconnectnow actually FORM the net (grid-snap fix). The stub endpoint (grid-aligned pin + a non-grid offset like 18 → 338) landed off the 10-unit schematic grid, but a created netflag/netport SNAPS to the nearest grid point (340) — so the stub ended a grid-step short of the flag's connection pin, the flag floated unconnected, its net NAME never applied, and same-named flags NEVER merged (every pin became its own auto-named 1-pin net$1N…). connect_pin now snaps its stub endpoint to the grid so it coincides with the snapped flag pin. Verified: two--net MERGEnetports now read back as one netMERGE deg 2 [R1.2, R2.1](was two$1Nsingletons). Unblocks building a netlisted schematic from scratch via the API. (Re-import needed.)pcb.pour.createrefuses a netless pour. An empty/absentnetused to be silently coerced to'', creating dead copper (a net:"" pour) thatpour-fit --replacecan't clear — the #34 confusion. It now errorsnet is required. The CLI (pcb pour/pour-fit) already fails fast; this is the connector-side backstop for rawdebug.exec_js/ other callers. (Takes effect after re-importing the connector.)pcb new-boardno longer silently steals the schematic. A schematic can belong to only ONE Board in EasyEDA Pro, socreateBoard(schematicUuid)on an already-bound schematic moves it into the new board — leaving the old board with just its PCB ("原理图没了").board.new_pcbnow detects an already-bound schematic and refuses with a clear error naming the owning board; pass--force(force: true) to move it deliberately.board list/pcb board-infono longer crash on a PCB-only or schematic-only Board.serializeBoardreadboard.schematic.uuid/board.pcb.uuidunconditionally, throwingCannot read properties of undefined (reading 'uuid')for any board missing one side (exactly the orphaned boards the oldnew-boardproduced). It now emitsnullfor the missing side.
-
v0.7.002 Jul 2026Release notes
Open source →The market-ready PCB pass since v0.6.0 — a reconstructed PCB DFM audit (
pcb check), a full silkscreen suite, the verified 4-layer inner-plane recipe, and a reconnect UX fix. (Consolidates the dev-loop releases 0.6.1–0.6.7 below.)Added
pcb check— reconstructed DFM audit (the PCB sibling ofsch check; catches the design-for-manufacture problems the nativepcb drcclearance check does NOT flag). Copper rules compute purely Go-side from placed copper and never mutate: dangling-end (a track end anchored to nothing → floating copper), acute-angle (same-net segments bending <90° → acid trap), non-orthogonal (a track off the 0/45/90° grid → free-angle routing), track-over-pad (a track crossing a pad it doesn't terminate on: cross-net = ERROR short), overlapping-via / single-layer-via, width-mismatch, duplicate-segment, and 3W parallel-coupling; plus silkscreen-flipped (a designator on the wrong silk layer / mirrored / non-upright) and per-layer antenna-keepout (an antenna module lacking a no-copper keep-out on every copper layer).--strictexits non-zero on any WARN/ERROR (gate-able).- Silkscreen suite —
pcb silk-add(a FREE silkscreen string: board credit / LED+/−polarity marks; configurable layer/font/stroke/rotation, JLCPCB-legible defaults),pcb silk-set(batch-adjust existing silk + an align-to-reference shortcut: center a board credit, align a label to a component/board/fill edge), and the read handlerspcb.silk.list(text layer/mirror/reverse/rotation) +pcb.region.listbbox that feed the DFM checks. easyeda pcb new-board(board.new_pcb) — create a brand-new board (板) with a fresh EMPTY PCB page bound to a schematic (CLI equivalent of the UI 新建PCB / 原理图转PCB), thenpcb import-changesto lay it out from scratch. Distinct fromboard.create(link-only). Runs the required 2-step SDK sequence that is otherwise a silent no-op —createBoard(schematicUuid)mints a board shell, thencreatePcb(boardName)adds the PCB INTO it — with shell rollback on failure.--schematicdefaults to the current board's schematic.easyeda notify(system.notify) — show a non-blocking toast INSIDE the EasyEDA window so the design flow can announce each stage live ("完成 布线,下一步 铺铜").--type info|success|warn|error|question,--duration.
Changed
pcb silk-align→ position-aware (v2) — ranks each designator's 4 sides by local free space + board position + a crowd-axis bonus, and avoids other parts' pads, bodies, keep-out regions, the board outline (now resolves rounded/polyline outlines), and other labels; keeps assembly clearance around each footprint (--spacing); a boxed-in part is reported (unresolved), never shoved onto a pad.pcb power-planesflips the GND inner layer to 内电层/PLANE after pouring (verified pour-while-SIGNAL → flip-type → rebuild recipe, DRC clean), matching the common customer stackup GND=内电层 / VCC=信号层. Drove the ESP32 regression board DRC 31→0, No-Connection→0.pcb auto-place --assembly-gap(default 40 mil) floors the chip-to-satellite gap at a hand-SOLDER clearance, not just the DRC routing clearance (~28 mil packed too tight to reach with an iron).pcb checkantenna-keepout now recognizes a single MULTI-layer(12) region as covering every copper layer — one 多层 keep-out replaces the per-layer set. design-flow.md PCB pipeline reordered so keep-out regions + silk-align run BEFORE routing (post-hoc keep-outs forced re-routing).
Fixed
- Reconnect toast dedup — one toast per daemon outage instead of one on every 3s retry (they were stacking and covering UI options during an outage).
Docs
- README split into a Chinese homepage (
README.md) + English (README.en.md); new demo recording storyboarddocs/demo-storyboard-esp32-mini.md; FEATURES action count 85→88; official-marketplace coverage survey (docs/marketplace-coverage.md).
-
v0.6.001 Jul 2026Release notes
Open source →PCB automation milestone (tasks #21–#32). Connector-side changes below; the bulk of the release is DAEMON-side (Go CLI) PCB automation, summarized under "Daemon".
Added
pcb.silk.align(task #30) — reposition each component's DESIGNATOR silkscreen with COLLISION AVOIDANCE: searches candidate slots around each footprint (preferredsidefirst, then other directions at increasing distance) and takes the first that hits no other component body and no already-placed label — dense-cluster designators get pushed into open space instead of piling up. The designator is a component-bound attribute (pcb_PrimitiveString is empty), repositioned viapcb_PrimitiveAttribute.getAllPrimitiveId(componentId)+.modify(id,{x,y}). ReportsunresolvedCollisions. CLI:pcb silk-align.pcb.stackup.set(task #26) — configure the board stackup: set the copper layer count (2/4/6/…/32 viasetTheNumberOfCopperLayers) and/or set inner layers' type SIGNAL↔PLANE (内电层, viamodifyLayer). A PLANE inner layer gives GND/power a dedicated plane on 4+ layer boards — the clean fix for the 2-layer pour conflict where two power nets can't both connect on one shared layer. Read viapcb.layers.list. CLI:pcb stackup set --layers 4 --plane 15 --plane 16.
Fixed
- Connector auto-reconnect wedge (需要重开窗口才恢复) — after a daemon restart
(dev hot-reload) or a long window-backgrounding,
isConnectingcould leaktrueand freeze EVERY reconnect path at once: the watchdog tick, the port scan, AND the focus/online/visibility wake listeners all early-returned onisConnecting, so only fully reopening the EasyEDA window recovered. Now (1) the watchdog force-resets a connect flow still unsettled after ~24s (STUCK_CONNECTING_TICKS), and (2) the foreground/online wake forces a clean reconnect through a stuckisConnecting(cancelConnectionFlow()first) instead of being blocked by it.
Daemon (CLI) — PCB automation pass
All real-machine verified on the ESP32 regression board; each
easyeda pcb …subcommand:- Rule-aware
route-short/auto-place/pour— read the board's live DRC rule (pcb drc-rules) and conform (widths/clearance/via/copper-to-edge) instead of hardcoding; fall back to a canonical JLCPCB fab-rule reference (real per-board-type exports). (#22/#32) route-shortv2: obstacle-aware L-orientation, and skips power/ground nets by default (they belong in a pour — routing 3V3 as thin tracks was the #1 DRC source). (#23)pcb outline-fit(tighten to parts) /pcb outline-round(rounded-rect outline). (#21/#29)pcb layout-lint— placement quality + routability score (ratsnest MST + crossings). (#25)pcb power-planes— 4-layer power distribution: GND + power on dedicated inner planes- via-stitch each pad (drove the regression board's No-Connection to 0). (#26)
pcb region/fill/slot— antenna keep-out (禁铺铜) & board cutout (挖槽). (#28)- Confirmed platform walls (no
eda.*API): teardrops, controlled-impedance, interactive routing.
-
v0.5.3030 Jun 2026Release notes
Open source →Added
pcb.add_component(task #20) — add ONE part to an EXISTING PCB and wire it, the working alternative topcb.import_changes(which is a no-op for API-added parts). Places the footprint (pcb_PrimitiveComponent.create), links it to its schematic twin (uniqueId + designator), assigns each pad's net from a caller- suppliednetsmap (pcb_PrimitivePad.modify— the step that actually wires it, since net→pad assignment is otherwise part of the broken import flow), and recomputes ratlines. CLI:easyeda pcb add-component.schematic.readnow also returns each component'suniqueId(the sch↔PCB link key to pass in).
Investigated
eda.pcb_Document.importChangesdoes NOT sync API-added components to an existing PCB (returns true, count unchanged) — root-caused to incremental-add being a platform no-op; superseded bypcb.add_component.
-
v0.5.1828 Jun 2026Release notes
Open source →Added
- PCB routing roadmap R1 (copper pour) + R2 (rip-up/list) from
docs/ecosystem-survey.md §7— 8 new actions, d.ts-grounded + adversarially reviewed:pcb.pour.create/pcb.pour.list/pcb.pour.delete/pcb.pour.rebuild— copper pour (铺铜). create takes rawpoints; the connector builds theIPCB_Polygonviapcb_MathPolygon.createPolygon(the missing piece behind the old "无法创建覆铜边框图元" failures — you must pass a polygon object, not raw points), thenrebuildCopperRegion()computes the fill.fill = solid|grid|grid45. CLIeasyeda pcb pour / pour-list / pour-delete / pour-rebuild.pcb.route.rip_up— reliable rip-up (getAll → filter → delete on stable primitive APIs, the official kirouting pattern). Deletes tracks+arcs+vias on copper layers only (TOP/BOTTOM/INNER) — never the board outline, silkscreen/assembly/mechanical artwork, or locked primitives.--netscopes; omit = all. CLIeasyeda pcb rip-up.pcb.line.list/pcb.via.list— read routed tracks/vias. CLIpcb track-list/pcb via-list.pcb.clear_routing— wraps nativeclearRouting(@alpha, may be undefined; preferpcb.route.rip_up). CLIeasyeda pcb clear-routing.- Smart/interactive routing (single/multi/diff routing, stretch, optimize,
length-tuning, fanout) has NO
eda.*API — documented as a hard boundary (§7).
- Five actions absorbed from the official open-source extension ecosystem
(see
docs/ecosystem-survey.md), each grounded inpro-api-typessignatures:schematic.library.get_by_lcsc— resolve LCSC C-numbers directly to{libraryUuid, uuid}viaeda.lib_Device.getByLcscIds(deterministic, no free-text ranking; reportsnotFound). CLIeasyeda lib by-lcsc --lcsc C….pcb.line.create— create a copper track viaeda.pcb_PrimitiveLine.create(mutating). CLIeasyeda pcb track.pcb.via.create— place a via viaeda.pcb_PrimitiveVia.create(mutating). CLIeasyeda pcb via.pcb.report— read-only design report (per-net length, net-class totals, differential-pair skew, equal-length spread) overeda.pcb_Net.getNetLength+eda.pcb_Drc.getAll{NetClasses,DifferentialPairs,EqualLengthNetGroups}. CLIeasyeda pcb report.pcb.drc.rules— readeda.pcb_Drc.getCurrentRuleConfigurationwithout running a check. CLIeasyeda pcb drc-rules.- Live-verified on a real board (PCB1, connector 0.5.15): A1 resolves
C6186→AMS1117-3.3 identity; A5 returns the full rule config; A3 reports 4 nets
with length/net-class/diff/equal-length; A2 creates a GND track (net length
read back 0→500, confirming it bound to the right net);
pcb drc+ save pass.
pcb.save— save the active PCB to disk (eda.pcb_Document.save), the PCB counterpart toschematic.save. CLIeasyeda pcb save. PCB autosave is now on: the daemon's debounced autosave firespcb.saveafter a PCB-mutating action, closing the in-memory-edit data-loss gap that previously only schematic edits were protected from (saveActionForDocTypenow mapspcb→pcb.save).
Fixed
pcb.outline.setnow creates the REAL board-outline object (类型=板框), not loose lines. Root cause of "the outline vanished when I cleared routing" + "DRC doesn't flag out-of-board": the outline was drawn as N separatepcb_PrimitiveLines on layer 11. A loose line on the board-outline layer is just a wire that happens to sit there — EasyEDA does NOT treat it as the board boundary (DRC ignores it for enclosure, the UI "清除布线 / clear routing" deletes it). Compared a UI-drawn 板框 against ours: the real outline is ONEpcb_PrimitivePolylinewhosepolygonis anIPCB_Polygon. Fix: build the closed-polygon source[x0,y0,'L',…,x0,y0]→eda.pcb_MathPolygon.createPolygon→eda.pcb_PrimitivePolyline.create('', 11, polygon, lineWidth, /*lock*/true)— one locked polyline.pcb.outline.get/clearupdated to read/delete the polyline (bbox from its rendered extent; legacy lines still handled). Default lineWidth 10mil. ReturnsoutlineId. Create flow verified live (createPolygon + polyline produced a 类型=板框 object matching the UI's).view region+schematic.snapshot --no-fitnow reliably captures the requested local region (issue #20). Three coordinated fixes: (1) the snapshot handler now waits for the canvas to repaint (tworequestAnimationFrames with a timeout fallback) BEFORE reading the frame, so a precedingview regionviewport has actually landed — previously--no-fitgrabbed the pre-region frame because EasyEDA does not synchronously repaint aftereda.*view calls (the--fitpath only "worked" by accident, sincezoomToAllPrimitivesnudged a redraw). (2) Built-in stale-frame detection: the snapshot result now exposes the framesha256; thread it back viasch snapshot --previous-sha256 <sha>and the connector detects a byte-identical (stale) frame, retries once after another redraw, and reportsstale/staleRetry. (3)view.regionnow normalizes the rectangle (sorts each axis to min/max) and rejects a zero-area box, so a reversed/degenerate bound no longer renders as a tiny sliver in a blank frame;view regionCLI help documents the y-DOWN schematic axis semantics and units.schematic.power.connect_pin(sch connect)--direction up/downno longer inverts the stub/netport endpoint. EasyEDA Pro schematic coords are y-DOWN (a larger stored y renders LOWER on screen, verified on 3.2.121, issue #19), but the endpoint math assumed y-UP, so--direction uppushed a top-pin stub DOWN into the IC body and--direction downpushed a bottom-pin stub UP — visually wrong even when DRC was clean.upnow decreases y (visually higher) anddownincreases y (visually lower). The flag-rotation table is unchanged: it is calibrated against real rendered bbox and already keyed to visual directions, so the corrected endpoint and the flag orientation now agree (callers no longer need the--direction down --rotation 90workaround to get a visually-upward netport).schematic.checkno longer false-flags merged-stub endpoints aswire-over-pin, and floating-pin findings now carry component-level detail. A pin coincident with a wire endpoint or a netflag/netport/netlabel anchor is the legitimate terminus of its ownsch connectstub; when EasyEDA auto-merges collinear touching stubs into one long wire an inner pin lands in that wire's interior and was wrongly reported as a through-pin short (the official DRC stays clean). Rule 3 now excludes pins that coincide with a wire vertex or a net-marker anchor. Floating-pin findings now includeprimitiveIdand apinDetails[]array (number,name,x,y) so the--jsonreport identifies the component and pin without a second lookup; the text report prints the per-pin name + coordinates and falls back toprimitiveIdwhen the designator is empty.
- PCB routing roadmap R1 (copper pour) + R2 (rip-up/list) from
-
v0.5.1427 Jun 2026Release notes
Open source →Fixed
schematic.pin.set_no_connectno longer reports a false success. On EasyEDA Pro 3.2.x,pin.setState_NoConnectedis a no-op — the pin primitive has nonoConnectedfield (verified by re-pull, DRC re-run, and a canvas snapshot: no 非连接标识 is ever placed and DRC still treats the pin as floating). The setter is typed@public, so the prior implementation compiled and returnedokwhile silently doing nothing. The handler now verifies the write and fails withEDA_CALL_FAILED, naming it as an EasyEDA platform limitation (not a connector defect) and returningnotApplied[]. It auto-passes if a future build makes the setter real. There is no publiceda.*API to place a 非连接标识 on this version — useschematic.checkto enumerate floating pins.schematic.wire.createnow normalizes nestedpoints(issue #5). EDA'seda.sch_PrimitiveWire.createonly accepts a flatnumber[]([x1,y1,x2,y2,…]); a nested[[x,y],…]payload failed withEDA_CALL_FAILED / "create failed!". The connector now flattens nested points at a single source of truth (normalizeWirePointsinutil.ts), so CLI /call/ sch.py /debug.exec_jsall accept either form. Also validates the list is an even-length (≥4) run of finite numbers. CLIsch wire --helpandauto-layout-sop.mdupdated to document both forms.
Added
schematic.check— reconstructed per-item design check + routing-quality rules. The EDA schematic DRC API (eda.sch_Drc.check) returns only an aggregate{count,type}andlayout-lintonly sees component bbox overlap; this fills both gaps by computing findings geometrically from primitives. Rules: (1) floating pins — a pin is connected iff a wire touches its coordinate (NC-marked excluded), grouped by component as{designator, pins[]}(the exact inputschematic.pin.set_no_connecttakes); (2) wire-crossing — two wire segments cross in their interiors (a routing tangle; shared endpoints/junctions excluded), reported with the intersection point; (3) wire-over-pin — a pin sits in a wire's interior (EasyEDA trims+connects there → unintended short; enforces the SOP "chain pin→pin, don't run a wire through a pin"). Returns{passed, summary{floatingPins,wireCrossings,wireOverPins,…}, findings[]}. CLI:easyeda sch check(--json,--strict,--all-pages). Verified live via a detect→fix→re-check loop on an ESP32-S3: 2 wire-crossings found and driven to 0.schematic.drc.checknow returns per-violation detail. Normalizes the SDK result into{passed, fatal, summary, violations[]}— each violation projects{level, rule, message, primitiveIds, designators, x, y}(raw kept) plus a severity summary and afatalcount for the design-flow S5 gate. CLIsch drcprints one line per violation and exits non-zero only whenfatal > 0. NOTE: the schematic SDK only provides an aggregate, so detail degrades honestly to "N issue(s) — EDA returned no per-item detail" (useschematic.checkfor the itemized floating-pin findings).schematic.snapshotanti-stale metadata (issue #2). The snapshot result now carriesprimitiveCount(live components + page primitives on the current page),capturedAt(ISO timestamp), and astaleadvisory string. EasyEDA does not auto-redraw aftereda.*edits, sogetCurrentRenderedAreaImagecan return a byte-identical STALE frame; callers compareprimitiveCountacross two snapshots to detect when the image didn't change but the page did. Judge state by data, use the screenshot for layout only.schematic.page.clear— one-shot page reset. Deletes every page-level primitive on the active page (components, net flags/ports/labels, wires, buses, and graphics — arcs/circles/rectangles/polygons/text), not just components.preserveSheet(default true) keeps the sheet/title block;dryRunreports per-type counts without deleting. Returns{deleted:{...}, total, deletedIds}. Fixes the trap whereschematic.component.deleteleft wires/buses behind whilecomponents.listreported a clean page, forcing a fall back to rawdebug.exec_js.schematic.primitives.delete— generalized, any-type delete. Routes each requested id to its owningsch_Primitive*class so wires/buses/graphics/flags can be deleted alongside components; omitprimitiveIdsto delete the current selection (select-all → delete). ReportsnotFoundids.
-
v0.5.827 Jun 2026Release notes
Open source →Changed
- Version bump to pair with the daemon/CLI artifact-path change. No connector
behavior change vs 0.5.7. The CLI now sends its working directory and the daemon
writes artifacts (snapshots, netlist/BOM exports) under
<cwd>/.easyeda/artifactswith sortable timestamped names (<YYYYMMDD-HHMMSS>-<kind>-<short>.ext) instead of a flatartifacts/art_<uuid>in the daemon's cwd. Released together to keep CLI and connector on the same version.
- Version bump to pair with the daemon/CLI artifact-path change. No connector
behavior change vs 0.5.7. The CLI now sends its working directory and the daemon
writes artifacts (snapshots, netlist/BOM exports) under