PackageTrack
Sign in Get early access

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 2026
Release Pre-release

Releases

latest 60 of 63
  1. v1.1.1 20 Aug 2026
    Release notes

    [1.1.1] — 2026-08-21

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

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

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

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


    Already installed? Upgrade in place:

    easyeda update          # CLI binary (sha256-verified) + skill dirs
    easyeda update --check  # report only
    

    First install:

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

    Installs/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 update reports a stale one and prints the re-import URL.

    Skill targets: set EASYEDA_INSTALL_SKILLS=codex,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.

    checksums.txt lists sha256 for every asset above.

    Open source →
    Release notes

    easyeda-agent v1.1.1 Latest

    Latest

    Compare

    Choose a tag to compare

    Open source →
    Release notes

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

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

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

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

    Open source →
  2. v1.1.0 20 Aug 2026
    Release notes

    [1.1.0] — 2026-08-21

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

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

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

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

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

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

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

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

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

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

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

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

    Added — skill 发布链路

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

    Already installed? Upgrade in place:

    easyeda update          # CLI binary (sha256-verified) + skill dirs
    easyeda update --check  # report only
    

    First install:

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

    Installs/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 update reports a stale one and prints the re-import URL.

    Skill targets: set EASYEDA_INSTALL_SKILLS=codex,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.

    checksums.txt lists sha256 for every asset above.

    Open source →
    Release notes

    easyeda-agent v1.1.0

    Compare

    Choose a tag to compare

    Open source →
    Release notes

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

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

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

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

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

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

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

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

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

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

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

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

    Added — skill 发布链路

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

    Nothing published for this version

  4. v1.0.2 18 Aug 2026
    Release notes

    [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 only
    

    First install:

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

    Installs/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 update reports a stale one and prints the re-import URL.

    Skill targets: set EASYEDA_INSTALL_SKILLS=codex,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.

    checksums.txt lists sha256 for every asset above.

    Open source →
    Release notes

    easyeda-agent v1.0.2

    Compare

    Choose a tag to compare

    Open source →
    Release notes

    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 列表展开)。

    Open source →
  5. v1.0.2-0.20260818100717-94c27f42bba7 18 Aug 2026 pre-release

    Nothing published for this version

  6. v1.0.1 18 Aug 2026
    Release notes

    [1.0.1] - 2026-08-18

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

    Fixed

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

    Already installed? Upgrade in place:

    easyeda update          # CLI binary (sha256-verified) + skill dirs
    easyeda update --check  # report only
    

    First install:

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

    Installs/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 update reports a stale one and prints the re-import URL.

    Skill targets: set EASYEDA_INSTALL_SKILLS=codex,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.

    checksums.txt lists sha256 for every asset above.

    Open source →
    Release notes

    easyeda-agent v1.0.1

    Compare

    Choose a tag to compare

    Open source →
    Release notes

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

    Fixed

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

    [1.0.0] - 2026-08-18

    里程碑:原理图功能正式上线(S0–S6 可交付)。 版本从 0.26.x 跃迁至 1.0.0,
    连接器与 CLI/skill 同版(四件套同版约定)。0.26.1 未单独发布,其连接器变更
    (schematic.bridgeCheckORPHAN_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 only
    

    First install:

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

    Installs/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 update reports a stale one and prints the re-import URL.

    Skill targets: set EASYEDA_INSTALL_SKILLS=codex,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.

    checksums.txt lists sha256 for every asset above.

    Open source →
    Release notes

    easyeda-agent v1.0.0

    Compare

    Choose a tag to compare

    Open source →
    Release notes

    里程碑:原理图功能正式上线(S0–S6 可交付)。 版本从 0.26.x 跃迁至 1.0.0, 连接器与 CLI/skill 同版(四件套同版约定)。0.26.1 未单独发布,其连接器变更 (schematic.bridgeCheckORPHAN_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 判据需本版连接器才生效。

    Open source →
  8. v0.26.1-0.20260817113301-75a6968f384d 17 Aug 2026 pre-release

    Nothing published for this version

  9. v0.26.0 17 Aug 2026
    Release notes

    [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 only
    

    First install:

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

    Installs/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 update reports a stale one and prints the re-import URL.

    Skill targets: set EASYEDA_INSTALL_SKILLS=codex,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.

    checksums.txt lists sha256 for every asset above.

    Open source →
    Release notes

    easyeda-agent v0.26.0

    Compare

    Choose a tag to compare

    Open source →
    Release notes

    连接器侧无代码变更 —— 版本号随 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.jsonlicense 随之改为 MITpackage.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 的编译产物)。
    Open source →
  10. v0.25.2-0.20260813071953-6346bd7ced99 13 Aug 2026 pre-release

    Nothing published for this version

  11. v0.25.1 13 Aug 2026
    Release notes

    [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 | sh
    

    Installs/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,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.

    Open source →
    Release notes

    easyeda-agent v0.25.1

    Compare

    Choose a tag to compare

    Open source →
    Release notes

    修复立创插件市场审核驳回「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 不变)。
    Open source →
  12. v0.25.0 12 Aug 2026
    Release notes

    [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 | sh
    

    Installs/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,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.

    Open source →
    Release notes

    easyeda-agent v0.25.0

    Compare

    Choose a tag to compare

    Open source →
    Release notes

    原理图布局体系定版: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 层无基线, 行为不变。
    Open source →
  13. v0.24.1-0.20260812064104-17f49afb2935 12 Aug 2026 pre-release

    Nothing published for this version

  14. v0.24.0 11 Aug 2026
    Release notes

    [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 | sh
    

    Installs/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,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.

    Open source →
    Release notes

    easyeda-agent v0.24.0

    Compare

    Choose a tag to compare

    Open source →
    Release notes

    原理图能力大版:持久化编组 + 布局质量打分 + 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。
    Open source →
  15. v0.23.1-0.20260810101936-6ca3cf902b6c 10 Aug 2026 pre-release

    Nothing published for this version

  16. v0.23.0 10 Aug 2026
    Release notes

    [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 | sh
    

    Installs/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,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.

    Open source →
    Release notes

    easyeda-agent v0.23.0

    Compare

    Choose a tag to compare

    Open source →
    Release notes

    插拔类器件特性版(用户在车机真板复测中逐条点名):打分骂什么、规划器就修什么, 两边口径锁死不分家。全部真机验证(车机 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,就位判据同步收紧。
    Open source →
  17. v0.22.0 09 Aug 2026
    Release notes

    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 保护/中途失败)。
    Open source →
  18. v0.21.7 09 Aug 2026
    Release notes

    Added

    • sch note —— 电路说明文本(纯 CLI,zone-draw 同款内部 exec_js 惯例)。 用户反馈:agent 产出的原理图常一页塞满、无分区框、无文字说明,电气对但交付 可读性差。Skill 布局默认升级为「分页分区+电路说明」三件套:S1 分页(每页一个 功能域)、S2 分区框+区名(sch zones setzone-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.listuniqueId + CLI pcb 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 还是矢量。 ⚠️ 底层 getExportDocumentFileobject 字面量,官方类型定义三个值全是错的 ('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 占死。
    Open source →
  19. v0.21.5-0.20260807115932-62a96130029f 07 Aug 2026 pre-release

    Nothing published for this version

  20. v0.21.4 07 Aug 2026
    Release notes

    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_FAILEDready 恒 false。现在 探针按文档类型选(pcbpcb.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):edaErrorString(err) 渲染抛出物,平台抛裸对象时根因整条丢失(实测 debug.exec_js 两条只剩「有个对象」)。而 errorDetail 存在的唯一理由就是承载 eda.* 的 原始抛出物(titleblock.modify 0/32 那次复盘只能靠 payload 反推)。新增纯函数 describeThrown:Error→message(空则 name)、对象→[code] message | {json} (可读部分在前,截断也留得住)、循环引用标 [Circular]、无可枚举属性直说 ——替换 actions.ts 9 处 + transport.ts 1 处同款三元(共享出口覆盖 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 check silk-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 的身份解析同步加固 (唯一命中也强制封装一致)。CLI easyeda sch resolve-lcsc [--apply] [--page]。 真机验:坏 supplierId 件 via=mpn 解析+写回,已带真 C 号件 via=instance 不重写。
    Open source →
  21. v0.21.3-0.20260805090636-b2a4c2bc6ab3 05 Aug 2026 pre-release

    Nothing published for this version

  22. v0.21.2 05 Aug 2026
    Release notes

    Changed

    • 显示名改为 EDA Agent Connector 后重传立创市场(包名与 uuid 均不变)。 按市场管理规范,displayName 去除 "easyeda" 字样;经与市场管理员确认,内部 包名 easyeda-agent-connector 与 uuid 无需改动,原条目撤销已解除,同一 条目重新上传即可——已装用户的原地自动更新不受影响,无需任何操作。 README(中/英)/包内 README/install.sh 均已附更名说明。
    Open source →
  23. v0.21.2-0.20260804182603-5f5b42572e20 04 Aug 2026 pre-release

    Nothing published for this version

  24. v0.21.1 04 Aug 2026
    Release notes

    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 输出一致,按它删除成功。
    Open source →
  25. v0.21.0 04 Aug 2026
    Release notes

    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 逃生舱。页懒加载定律适用(只见激活页);CLI easyeda 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)。
    Open source →
  26. v0.20.0 04 Aug 2026
    Release notes

    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」)。publisher easyeda-agentzhoushoujian;name easyeda-agent-connectoreda-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 依赖它)。
    Open source →
  27. v0.19.0 04 Aug 2026
    Release notes

    🙏 感谢 @NeoSpeciesPR #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.modify 32 次调用 0 次成功。
    • 新增本地 stdio MCP 适配层(来自 PR #154,@NeoSpecies):mcp/ 将现有 easyeda CLI/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-types index.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_MS 1500→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:falsealreadySet(改前就等于期望值)不计入 applied也不豁免全失败硬门unknownKeys 是本 action 特有的诊断:那些根本不是明细项,修法是换 key 而不是重试—— 明细表改不了纸张尺寸。SDK 显式返回 false 也不再被吞。9 个单测覆盖上述每一条。

    • audit log 记录 errorDetail —— 协议 Error.Detail(连接器捕获的平台原始报错)此前 被丢弃,日志里只剩我们自己的包装文案(如 "Failed to modify schematic page title block."), 事后定位根因无从谈起:上面那条 titleblock 的调查只能从 payload 反推。现在原始错误一并落盘。

    Open source →
  28. v0.18.3 01 Aug 2026
    Release notes

    Added

    • pcb layout-lint 新增跨网短路检测(short ERROR)—— 从「靠太近」升级到「这两网短路」: 两器件 bbox 相交时进一步比焊盘铜皮矩形,若两块铜在共享层上真的压在一起且分属不同 网络,报 ERROR short C2.1[VBAT_RAW] ↔ D2.2[SW1_NODE] —— 与 KiCad 的 shorting_items 对齐(此前同一份数据上 KiCad 定性成短路,我们只报几何重叠)。short 与 overlap 同级致命 (ok=false、score 归零、verdict short--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 同步补充。
    Open source →
  29. v0.18.2 29 Jul 2026
    Release notes

    Fixed

    • 安装脚本更新 skill 不再产生 .bak 备份、污染 skills 目录:install.shinstall_skill_to 从「先 mveasyeda-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),避免孤儿文本和跨页误删。
    Open source →
  30. v0.18.1-0.20260722161206-016244c8e3d7 22 Jul 2026 pre-release

    Nothing published for this version

  31. v0.18.0 22 Jul 2026
    Release notes

    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=10000costHardReject,四方向全进图签时明确失败,否则主动转向安全方向(不再把 netport 落进明细表)。
    • 创建后真实 bbox 兜底(#147 DoD2):批量后回读真实 bbox,凡侵入图签 keep-out 的 marker 连 wire 一并删除并判失败——绝不「返回成功且图签上留 marker」。
    • partial 报告(#146):acReportpartial/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 成功后,按 --specmodules[].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 引脚下漏判)。
    • 官方 autoLayoutdesignatorDeviceTypeMap:此前裸调无参;现从页面真实位号前缀分类 (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 不与图签相交待活体编辑器验收。
    Open source →
  32. v0.17.1-0.20260721104035-a3aff5636f43 21 Jul 2026 pre-release

    Nothing published for this version

  33. v0.17.0 21 Jul 2026
    Release notes

    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,不再分发)。
    Open source →
  34. v0.16.0 20 Jul 2026
    Release notes

    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-lint zone-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)/跨命令时前台漂移会把编辑落到错误的页。--docpostAction 咽喉点加守卫:变更动作(catalog Mutates)落地前 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 语义。
    Open source →
  35. v0.14.2-0.20260719083708-638ccaaa699f 19 Jul 2026 pre-release

    Nothing published for this version

  36. v0.14.1 19 Jul 2026
    Release notes

    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)。
    Open source →
  37. v0.14.1-0.20260717164530-40534cd1044f 17 Jul 2026 pre-release

    Nothing published for this version

  38. v0.14.0 17 Jul 2026
    Release notes

    「真机可信化」版:一天内 16 个 issue 闭环的集中发布。三大主题: ① via/导入可信化——EPAD 内嵌热过孔的删除欺骗与赋网易失被彻底摸清(删不掉: 假成功+立即 getAll 也骗+reload 原 id 复活;赋网只活到 reload),pcb.route.delete 前置拒删、pcb.add_component 放置即键合、CLI 新增 pcb via-bond 幂等重键合 + pcb check netless-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 是触发器。
    Open source →
  39. v0.13.1-0.20260715194641-4481b064f520 15 Jul 2026 pre-release

    Nothing published for this version

  40. v0.13.0 15 Jul 2026
    Release notes

    「规范进代码」版: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)。
    • easyeda pcb mount-holes — 四角 M3 安装孔自动放置(#102):读板框 bbox 四角内缩放孔 (--dia 默认 126mil=Ø3.2mm / --inset 197mil≈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)。
    • staleRisk advisory —— 铁律 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/heightpcb.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 --jsonobjs 数组现在可直接粘贴。

    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.listpoints 字段,而连接器只在 includeBBox 里给几何。
    • via-crosses-plane 的「plane 无网」分支降为 INFO(#110):实证 PLANE 层 pour 在 doc reload 后被装进负片存储、扩展 API 无任何读取路径(平台行为,非本项目 bug), 该分支在 reload 后必然假阳性 → 不再计入 warnings/拦 --strict,message 指引以 pcb drc Connection=0 为准。
    • pcb.silk_netnames 碰撞检测从硬编码 50×50mil 改真实焊盘 extent。
    • --dry-run 预览不再被当成 mutation(#112):daemon 侧统一按 payload 的 dryRun 标志把预览排除出 Mutates 判定 —— 之前只跑 pcb clear --dry-run(不改板)也会 arm staleRisk 并触发 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):六级探测(--scriptEASYEDA_SKILLS_DIR → 已安装 skill 目录(复用 skill status 同一份逻辑) → 可执行文件兄弟路径 → cwd → $PATH), 非仓库 cwd 下不再找不到;找不到时列出每一条探测过的路径。
    Open source →
  41. v0.12.1-0.20260714103559-b1393cfe9f92 14 Jul 2026 pre-release

    Nothing published for this version

  42. v0.12.1-0.20260713182234-db9747d0cfb5 13 Jul 2026 pre-release

    Nothing published for this version

  43. v0.12.0 13 Jul 2026
    Release notes

    本版把项目工作流机械化(#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-lint off-board 改按焊盘中心判:连接器身/courtyard 突出板框(Type-C mating 面、 卡座、螺钉端子)但焊盘全在框内属有意贴边,不再误判 off-board、不再卡死 confirm-layout 授权链;无焊盘件兜底 bbox(焊盘边到板框净空仍归 DRC)。
    • pcb check 弧感知(消除 beautify 圆角伪报):beautify 把拐角圆化成 track→arc→track 后, dangling-endfloating-track-island 两个检测因不认弧而爆假阳性(实测一块板 dangling 0→130、island 0→10,而官方 DRC 报 0 断)。现 dangling-end 认「同层弧端点=track 端已连」、 floating-track-island弧桥接 union(镜像过孔桥接)——实测两者双双归零。
    Open source →
  44. v0.11.3 11 Jul 2026
    Release notes

    守护进程端口稳定性(补丁):

    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)。
    Open source →
  45. v0.11.2 11 Jul 2026
    Release notes

    本版聚焦 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 模组 mainedge、J1 螺钉端子开口 朝外、天线 keepout pcb check loop 0→1→0);两轮多 agent 对抗审查复核 5 个 review 修复 (0 新增回归)。
    Open source →
  46. v0.11.0 10 Jul 2026
    Release notes

    功能版本(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 action pcb.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.mdpcb beautify 命令条目;docs/ecosystem-survey.md / docs/marketplace-coverage.md absorb-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 跑一遍确认。
    Open source →
  47. v0.10.0 10 Jul 2026
    Release notes

    功能版本(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
    Open source →
  48. v0.9.1-0.20260708185150-505e833d2eae 08 Jul 2026 pre-release

    Nothing published for this version

  49. v0.9.0 08 Jul 2026
    Release notes

    自 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 check geom-net-mismatch 对 netflag/netport 静音:designator 为空的原语 网表交叉校验静音,几何单独判(64/64 误报→0)。
    • sch autolayout 锚点 snap 到 5 网格:分区居中产出的分数坐标(206.25)不再致 connect_pin 批量失败;connect_pin 引脚离网格时快速失败给可行动报错。
    • lib search 对 LCSC C 号精确匹配:不再模糊命中错料。
    Open source →
  50. v0.8.4-0.20260707161416-2428bba5c46e 07 Jul 2026 pre-release

    Nothing published for this version

  51. v0.8.4-0.20260706120918-484ce29439df 06 Jul 2026 pre-release

    Nothing published for this version

  52. v0.8.3 06 Jul 2026
    Release notes

    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 release now publishes the skill to ClawHub at the same version (best-effort — a hub failure doesn't block the release; retry with make publish-skill VERSION=…). Uses an absolute path to dodge the clawhub global-workdir trap.

    Fixed

    • currentLayer:null readback (#40)pcb.layers.list now activates the PCB tab before getCurrentLayer and returns visibleLayers as display-state evidence when currentLayer is empty.
    • README install commands — removed the non-working skillhub.cn CLI command (web-only community, no /api/cli/v1 endpoint); ClawHub + GitHub Release skills.tar.gz are the supported skill-install paths.
    Open source →
  53. v0.8.1 04 Jul 2026
    Release notes

    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 switch only changes the foreground tab). Refreshes the per-document reflow rules snapshot; run pcb pour-rebuild after reloading a PCB. Saves first (typed schematic.save/pcb.save by document type), so no edits are lost.
    • easyeda pcb drc-rules-set --pour-clearance <mil> — the write side of drc-rules (v1 knob: pour/plane copper clearance, raise-only — never loosens a stricter board). Patches Plane lineClearance (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-2 steps (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).
    Open source →
  54. v0.8.0 03 Jul 2026
    Release notes

    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.json manifest, GATED on the frame — a BLANK / STALE / wrong-document (foreground tab not a PCB) capture exits non-zero, so a set -e recording script halts instead of banking a bad frame. Go/CLI only, no re-import.
    • 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 that pour-fit --replace can't clear — it only matches same-net pours). Surfaced by the new pcb check netless-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 — prefer getNetlistFile(), which sch read uses and never hangs). Go/CLI only, no re-import.

    Fixed

    • connect_pin/sch autoconnect now 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 MERGE netports now read back as one net MERGE deg 2 [R1.2, R2.1] (was two $1N singletons). Unblocks building a netlisted schematic from scratch via the API. (Re-import needed.)
    • pcb.pour.create refuses a netless pour. An empty/absent net used to be silently coerced to '', creating dead copper (a net:"" pour) that pour-fit --replace can't clear — the #34 confusion. It now errors net is required. The CLI (pcb pour / pour-fit) already fails fast; this is the connector-side backstop for raw debug.exec_js / other callers. (Takes effect after re-importing the connector.)
    • pcb new-board no longer silently steals the schematic. A schematic can belong to only ONE Board in EasyEDA Pro, so createBoard(schematicUuid) on an already-bound schematic moves it into the new board — leaving the old board with just its PCB ("原理图没了"). board.new_pcb now 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-info no longer crash on a PCB-only or schematic-only Board. serializeBoard read board.schematic.uuid / board.pcb.uuid unconditionally, throwing Cannot read properties of undefined (reading 'uuid') for any board missing one side (exactly the orphaned boards the old new-board produced). It now emits null for the missing side.
    Open source →
  55. v0.7.0 02 Jul 2026
    Release notes

    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 of sch check; catches the design-for-manufacture problems the native pcb drc clearance 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). --strict exits non-zero on any WARN/ERROR (gate-able).
    • Silkscreen suitepcb 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 handlers pcb.silk.list (text layer/mirror/reverse/rotation) + pcb.region.list bbox 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), then pcb import-changes to lay it out from scratch. Distinct from board.create (link-only). Runs the required 2-step SDK sequence that is otherwise a silent no-op — createBoard(schematicUuid) mints a board shell, then createPcb(boardName) adds the PCB INTO it — with shell rollback on failure. --schematic defaults 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-planes flips 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 check antenna-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 storyboard docs/demo-storyboard-esp32-mini.md; FEATURES action count 85→88; official-marketplace coverage survey (docs/marketplace-coverage.md).
    Open source →
  56. v0.6.0 01 Jul 2026
    Release notes

    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 (preferred side first, 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 via pcb_PrimitiveAttribute.getAllPrimitiveId(componentId) + .modify(id,{x,y}). Reports unresolvedCollisions. CLI: pcb silk-align.
    • pcb.stackup.set (task #26) — configure the board stackup: set the copper layer count (2/4/6/…/32 via setTheNumberOfCopperLayers) and/or set inner layers' type SIGNAL↔PLANE (内电层, via modifyLayer). 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 via pcb.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, isConnecting could leak true and freeze EVERY reconnect path at once: the watchdog tick, the port scan, AND the focus/online/visibility wake listeners all early-returned on isConnecting, 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 stuck isConnecting (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-short v2: 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-planes4-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.
    Open source →
  57. v0.5.30 30 Jun 2026
    Release notes

    Added

    • pcb.add_component (task #20) — add ONE part to an EXISTING PCB and wire it, the working alternative to pcb.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- supplied nets map (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.read now also returns each component's uniqueId (the sch↔PCB link key to pass in).

    Investigated

    • eda.pcb_Document.importChanges does NOT sync API-added components to an existing PCB (returns true, count unchanged) — root-caused to incremental-add being a platform no-op; superseded by pcb.add_component.
    Open source →
  58. v0.5.18 28 Jun 2026
    Release notes

    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.rebuildcopper pour (铺铜). create takes raw points; the connector builds the IPCB_Polygon via pcb_MathPolygon.createPolygon (the missing piece behind the old "无法创建覆铜边框图元" failures — you must pass a polygon object, not raw points), then rebuildCopperRegion() computes the fill. fill = solid|grid|grid45. CLI easyeda pcb pour / pour-list / pour-delete / pour-rebuild.
      • pcb.route.rip_upreliable 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. --net scopes; omit = all. CLI easyeda pcb rip-up.
      • pcb.line.list / pcb.via.list — read routed tracks/vias. CLI pcb track-list / pcb via-list.
      • pcb.clear_routing — wraps native clearRouting (@alpha, may be undefined; prefer pcb.route.rip_up). CLI easyeda 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 in pro-api-types signatures:
      • schematic.library.get_by_lcsc — resolve LCSC C-numbers directly to {libraryUuid, uuid} via eda.lib_Device.getByLcscIds (deterministic, no free-text ranking; reports notFound). CLI easyeda lib by-lcsc --lcsc C….
      • pcb.line.create — create a copper track via eda.pcb_PrimitiveLine.create (mutating). CLI easyeda pcb track.
      • pcb.via.create — place a via via eda.pcb_PrimitiveVia.create (mutating). CLI easyeda pcb via.
      • pcb.report — read-only design report (per-net length, net-class totals, differential-pair skew, equal-length spread) over eda.pcb_Net.getNetLength + eda.pcb_Drc.getAll{NetClasses,DifferentialPairs,EqualLengthNetGroups}. CLI easyeda pcb report.
      • pcb.drc.rules — read eda.pcb_Drc.getCurrentRuleConfiguration without running a check. CLI easyeda 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 to schematic.save. CLI easyeda pcb save. PCB autosave is now on: the daemon's debounced autosave fires pcb.save after a PCB-mutating action, closing the in-memory-edit data-loss gap that previously only schematic edits were protected from (saveActionForDocType now maps pcbpcb.save).

    Fixed

    • pcb.outline.set now 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 separate pcb_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 ONE pcb_PrimitivePolyline whose polygon is an IPCB_Polygon. Fix: build the closed-polygon source [x0,y0,'L',…,x0,y0]eda.pcb_MathPolygon.createPolygoneda.pcb_PrimitivePolyline.create('', 11, polygon, lineWidth, /*lock*/true) — one locked polyline. pcb.outline.get/clear updated to read/delete the polyline (bbox from its rendered extent; legacy lines still handled). Default lineWidth 10mil. Returns outlineId. Create flow verified live (createPolygon + polyline produced a 类型=板框 object matching the UI's).
    • view region + schematic.snapshot --no-fit now reliably captures the requested local region (issue #20). Three coordinated fixes: (1) the snapshot handler now waits for the canvas to repaint (two requestAnimationFrames with a timeout fallback) BEFORE reading the frame, so a preceding view region viewport has actually landed — previously --no-fit grabbed the pre-region frame because EasyEDA does not synchronously repaint after eda.* view calls (the --fit path only "worked" by accident, since zoomToAllPrimitives nudged a redraw). (2) Built-in stale-frame detection: the snapshot result now exposes the frame sha256; thread it back via sch snapshot --previous-sha256 <sha> and the connector detects a byte-identical (stale) frame, retries once after another redraw, and reports stale/staleRetry. (3) view.region now 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 region CLI help documents the y-DOWN schematic axis semantics and units.
    • schematic.power.connect_pin (sch connect) --direction up/down no 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 up pushed a top-pin stub DOWN into the IC body and --direction down pushed a bottom-pin stub UP — visually wrong even when DRC was clean. up now decreases y (visually higher) and down increases 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 90 workaround to get a visually-upward netport).
    • schematic.check no longer false-flags merged-stub endpoints as wire-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 own sch connect stub; 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 include primitiveId and a pinDetails[] array (number, name, x, y) so the --json report identifies the component and pin without a second lookup; the text report prints the per-pin name + coordinates and falls back to primitiveId when the designator is empty.
    Open source →
  59. v0.5.14 27 Jun 2026
    Release notes

    Fixed

    • schematic.pin.set_no_connect no longer reports a false success. On EasyEDA Pro 3.2.x, pin.setState_NoConnected is a no-op — the pin primitive has no noConnected field (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 returned ok while silently doing nothing. The handler now verifies the write and fails with EDA_CALL_FAILED, naming it as an EasyEDA platform limitation (not a connector defect) and returning notApplied[]. It auto-passes if a future build makes the setter real. There is no public eda.* API to place a 非连接标识 on this version — use schematic.check to enumerate floating pins.
    • schematic.wire.create now normalizes nested points (issue #5). EDA's eda.sch_PrimitiveWire.create only accepts a flat number[] ([x1,y1,x2,y2,…]); a nested [[x,y],…] payload failed with EDA_CALL_FAILED / "create failed!". The connector now flattens nested points at a single source of truth (normalizeWirePoints in util.ts), so CLI / call / sch.py / debug.exec_js all accept either form. Also validates the list is an even-length (≥4) run of finite numbers. CLI sch wire --help and auto-layout-sop.md updated 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} and layout-lint only 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 input schematic.pin.set_no_connect takes); (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.check now 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 a fatal count for the design-flow S5 gate. CLI sch drc prints one line per violation and exits non-zero only when fatal > 0. NOTE: the schematic SDK only provides an aggregate, so detail degrades honestly to "N issue(s) — EDA returned no per-item detail" (use schematic.check for the itemized floating-pin findings).
    • schematic.snapshot anti-stale metadata (issue #2). The snapshot result now carries primitiveCount (live components + page primitives on the current page), capturedAt (ISO timestamp), and a stale advisory string. EasyEDA does not auto-redraw after eda.* edits, so getCurrentRenderedAreaImage can return a byte-identical STALE frame; callers compare primitiveCount across 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; dryRun reports per-type counts without deleting. Returns {deleted:{...}, total, deletedIds}. Fixes the trap where schematic.component.delete left wires/buses behind while components.list reported a clean page, forcing a fall back to raw debug.exec_js.
    • schematic.primitives.delete — generalized, any-type delete. Routes each requested id to its owning sch_Primitive* class so wires/buses/graphics/flags can be deleted alongside components; omit primitiveIds to delete the current selection (select-all → delete). Reports notFound ids.
    Open source →
  60. v0.5.8 27 Jun 2026
    Release notes

    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/artifacts with sortable timestamped names (<YYYYMMDD-HHMMSS>-<kind>-<short>.ext) instead of a flat artifacts/art_<uuid> in the daemon's cwd. Released together to keep CLI and connector on the same version.
    Open source →

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive