NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Go modules · #2548 by repository stars
Last release 8 days ago
30 Sep 2026
Ships on a steady schedule
a new release about every 8 days
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
3 months old
89 releases · first in 2026
One column per month.
Nothing published for this version
Add schematic PNG/JPEG/SVG reference-image import and ID-based geometry management; fix image deletion and explicit intrinsic sizing.
Already installed? Upgrade in place:
easyeda update # CLI binary (sha256-verified) + skill dirs
easyeda update --check # report only
First install (macOS/Linux):
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | bash
First install (native Windows, PowerShell 5.1+):
irm https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.ps1 | iex
Installs/updates:
The connector .eext is never auto-updated for sideloads. Connector patch drift within the same major.minor line is compatible; re-import only when easyeda update reports a major/minor mismatch.
Skill targets: set EASYEDA_INSTALL_SKILLS=codex,agents,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
checksums.txt lists sha256 for every asset above.
Acceptance report, baseline and test cases: test-evidence.zip (SHA256 in checksums.txt).
Nothing published for this version
新增 sch layout-plan --net-labels :在用户明确接受标签连接时,各器件用短引线和同名网络标记连接,按完整包络分行布局;保留网表、引脚、NC、器件姿态与功能归属。
sch layout-plan --net-labels:在用户明确接受标签连接时,各器件用短引线和同名网络标记连接,按完整包络分行布局;保留网表、引脚、NC、器件姿态与功能归属。--unbounded 展开通道布局,保留器件间实体连线路径,允许合法 X 交叉,不限制区域/纸张尺寸;不同网端点/T 接触、共线重叠和遮挡仍拒绝。layout-plan --lib,直接读取原 lib-layout canonical 输入,输出可无纸张渲染的局部多区几何;结果和报告记录布局模式与原输入哈希。Already installed? Upgrade in place:
easyeda update # CLI binary (sha256-verified) + skill dirs
easyeda update --check # report only
First install (macOS/Linux):
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | bash
First install (native Windows, PowerShell 5.1+):
irm https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.ps1 | iex
Installs/updates:
The connector .eext is never auto-updated for sideloads. Connector patch drift within the same major.minor line is compatible; re-import only when easyeda update reports a major/minor mismatch.
Skill targets: set EASYEDA_INSTALL_SKILLS=codex,agents,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
checksums.txt lists sha256 for every asset above.
Nothing published for this version
修复连接器重连、窗口身份与迟到上下文处理,保留明确选窗和在途写入不重放行为。
Already installed? Upgrade in place:
easyeda update # CLI binary (sha256-verified) + skill dirs
easyeda update --check # report only
First install (macOS/Linux):
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | bash
First install (native Windows, PowerShell 5.1+):
irm https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.ps1 | iex
Installs/updates:
The connector .eext is never auto-updated for sideloads. Connector patch drift within the same major.minor line is compatible; re-import only when easyeda update reports a major/minor mismatch.
Skill targets: set EASYEDA_INSTALL_SKILLS=codex,agents,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
checksums.txt lists sha256 for every asset above.
Acceptance report, baseline and test cases: test-evidence.zip (SHA256 in checksums.txt).
新增 typed web reload :保存文档后刷新 Web EDA,等待新的连接器注册并核对原工程/页面;工程查找支持有界总超时。
web reload:保存文档后刷新 Web EDA,等待新的连接器注册并核对原工程/页面;工程查找支持有界总超时。.eext,核对实际运行版本。1.6.0-dev.21 同版真实链路全部通过并经独立复核;正式包沿用同一产品源码,另做版本、构建及资产校验。范围为个人空间及既有自定义规则夹具,团队与首次规则初始化未验收。not-run。既有求解预算耗尽和严格 DRC 缺口不视为已解决;不宣称完整电路设计 E2E 通过。test-evidence.zip,包含声明范围、基准、逐项报告及哈希;基础通过不代表历史间歇缺陷已修复。Already installed? Upgrade in place:
easyeda update # CLI binary (sha256-verified) + skill dirs
easyeda update --check # report only
First install (macOS/Linux):
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | bash
First install (native Windows, PowerShell 5.1+):
irm https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.ps1 | iex
Installs/updates:
The connector .eext is never auto-updated for sideloads. Connector patch drift within the same major.minor line is compatible; re-import only when easyeda update reports a major/minor mismatch.
Skill targets: set EASYEDA_INSTALL_SKILLS=codex,agents,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
checksums.txt lists sha256 for every asset above.
Acceptance report, baseline and test cases: test-evidence.zip (SHA256 in checksums.txt).
Add parameterized PCB placement and routing foundations: schema-v3 layout intent, bounded candidate generation, replayable Apply playbooks, module-own
pcb module-check evidence after save/reload. The retained AT32F415 examples include live placement/routing facts plus explicit rejected candidates; they are reusable evidence, not a claim that the whole board or crystal module has completed final acceptance.pcb via-fence for perimeter-only GND/RF stitching around a protected rectangle. It includes each corner once, redistributes every edge so --pitch is a maximum spacing, expands outward with --margin, uses live via rules for unspecified sizes, and keeps dry-run pure. The crystal-guard contract requires controlled MCU spacing, short/direct OSC paths, an explicit TOP GND guard, TOP/BOTTOM no-pours, and an external GND via fence.project.open and project.export, Cobra and MCP wrappers, active-project/page identity checks, explicit unsaved-data acknowledgement, bounded native .epro2 transfer, ZIP/CRC validation, no-overwrite delivery, and SHA-256 reporting. The revised typed path was live-verified across two saved projects; archive import/restore remains unverified (restoreVerified:false).install.ps1, per-site part UUID relocalization, board-fitted PCB snapshots, typed layout-review evidence, V4 compatibility reporting, PCB stackup/config/net-color controls, document close/reload, poured-copper readback, and safer project/document recovery when no tab is active.null, never fabricated zeroes; CLI output and workflow gates now fail on a native failed verdict even when detailed counts are unavailable. Non-strict success may still report advisory warnings (#255).net_label writes on V3 or unknown hosts before a batch starts; allow a new, fully verified wire to preserve unchanged historical geometry findings while still failing any new/changed defect; and add guarded daemon stop/restart with live health/PID identity checks instead of guessing or terminating an unrelated process.activate(). Reuse one versioned transport controller across bundle evaluations, keep lifecycle calls delegated, and release it on deactivate() instead of registering competing sockets.layout-lint reports nets-unproven separately, and the Skill forbids classifying floatingPins as truly unconnected when the netlist read was unavailable..eext, reopen the Web editor, and verify the reported Connector version/actions. The release restores the stable marketplace UUID; the temporary dev.5/dev.6 fresh UUID was only a cache-bypass fallback and must not become the published identity.Already installed? Upgrade in place:
easyeda update # CLI binary (sha256-verified) + skill dirs
easyeda update --check # report only
First install (macOS/Linux):
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | bash
First install (native Windows, PowerShell 5.1+):
irm https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.ps1 | iex
Installs/updates:
The connector .eext is never auto-updated for sideloads. Connector patch drift within the same major.minor line is compatible; re-import only when easyeda update reports a major/minor mismatch.
Skill targets: set EASYEDA_INSTALL_SKILLS=codex,agents,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
checksums.txt lists sha256 for every asset above.
Nothing published for this version
Add typed pcb.config.get/set and pcb config get/clearance/track/via/bind for parameterized PCB design rules: mil/mm conversion, Track-to-Track clearan
Add typed pcb.config.get/set and pcb config get/clearance/track/via/bind for parameterized PCB design rules: mil/mm conversion, Track-to-Track clearance, named track rules, via diameter bounds, and class/member Track assignments. Preserve unrelated settings, preview exact changes, detect source drift, and report unverified writes as partial failures. Reuse full-rule rollback/readback and accept config exports for restore. Real Web 3.2.203 fixtures cover the 260919 exam settings offline; live save/reload and the fixed ESP32 end-to-end regression remain pending.
Accept English “Confirm Importing changes information” / “Apply Changes” during typed PCB import, normalize whitespace/case, and retain exact button matching (#223). CLI diagnostics stop on unconfirmed import instead of directing an Agent to edit the project manually.
Document the V3.2 extension Config/Enabled permission controls and reported cross-version installation/cold-start workarounds (#222). The 3.2.149 cold-start defect (#221) remains unresolved; module bootstrap proposal #219 is not included.
Centralize long-read budgets at the CLI HTTP boundary: document open receives a 30s daemon window and includePins reads receive 150s, plus the existing 2s HTTP response grace. Explicit shorter diagnostic deadlines and larger caller budgets remain intact (#207, #214). Verify the live target UUID after an open error before failing the document guard.
Stop zone-arrange repair immediately on a failed connect_pin write, removing both unconditional replay and later repair-round replay (#206). This does not cancel late host promises or resolve the separate late-write cleanup issue #208.
Refocus the Skill on parameterized, source-attributed examples and typed-only project operations; include the existing main-branch workflow and PCB configuration work in this release.
Validation boundary: automated Go/connector/lint/Skill/release checks are run for this patch. No EDA window is connected on the release host, so the fixed ESP32 end-to-end regression and fresh-connector live import/save/reload verification remain incomplete. Do not treat this release as a completed board acceptance.
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 | bash
Installs/updates:
The connector .eext is never auto-updated for sideloads. Connector patch drift within the same major.minor line is compatible; re-import only when easyeda update reports a major/minor mismatch.
Skill targets: set EASYEDA_INSTALL_SKILLS=codex,agents,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
checksums.txt lists sha256 for every asset above.
Add offline sch zone-review ownership diagnostics and run them automatically before layout-plan --zones . Reports preserve source hashes and explicit
sch zone-review ownership diagnostics and run them automatically before layout-plan --zones. Reports preserve source hashes and explicit component/pin/net evidence for multi-core hints, non-rail subgraphs detached from the declared core, and rail-only attachment endpoints, while leaving the source JSON and Apply state untouched for AI review.lib device validate --spec as an offline preflight for datasheet-backed library authoring. Complete Device builds now require manufacturer/MPN/package evidence with source pages, a declared land-pattern basis, valid symbol/footprint geometry, and an exact pin-to-pad mapping before any EasyEDA mutation. Route the public Skill through the new PDF-reading workflow and provide a reusable JSON example.pcb check: Track↔Track now uses its own rule instead of the larger Track↔Pad/Via routing clearance (#218).ARC,signedAngle,endX,endY source format with direction-checked ≤2° sampling, and select a unique containing outer ring from multi-polyline outlines while keeping unknown curves and ambiguous rings fail-closed (#215).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 | bash
Installs/updates:
The connector .eext is never auto-updated for sideloads. Connector patch drift within the same major.minor line is compatible; re-import only when easyeda update reports a major/minor mismatch.
Skill targets: set EASYEDA_INSTALL_SKILLS=codex,agents,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
checksums.txt lists sha256 for every asset above.
Expose reusable, library-independent schematic layout calculation and deterministic SVG rendering through sch layout-plan and sch layout-render .
sch layout-plan and sch layout-render.sch layout-edit, and protected local marker repair with fresh-snapshot and out-of-scope stability guards.draft, topology_ready, and compose_ready readiness checks. Source exercises, reference drawings, private instance identities and local drafts are not release assets.update --local-dir, exact development-runtime checks, and Makefile targets for installed local daemon restart and validation.module_port pins as one real in-zone fanout tree after a functional split while retaining the source cross-zone port contract. Keep interleaved nets electrically separate and verify the exact physical islands that were joined.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 | bash
Installs/updates:
The connector .eext is never auto-updated for sideloads. Connector patch drift within the same major.minor line is compatible; re-import only when easyeda update reports a major/minor mismatch.
Skill targets: set EASYEDA_INSTALL_SKILLS=codex,agents,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
checksums.txt lists sha256 for every asset above.
Nothing published for this version
Keep the strict latest-release session gate for CLI, installed Skill and running daemon, while accepting Connector patch drift within the same major.m
gh-proxy.com transport fallback only when checksums.txt was obtained directly from GitHub. Mirror-delivered CLI and Skill archives remain subject to the GitHub-published SHA-256 digest; EASYEDA_GITHUB_PROXY=off disables fallback.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 | bash
Installs/updates:
The connector .eext is never auto-updated for sideloads. Connector patch drift within the same major.minor line is compatible; re-import only when easyeda update reports a major/minor mismatch.
Skill targets: set EASYEDA_INSTALL_SKILLS=codex,agents,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
checksums.txt lists sha256 for every asset above.
Authenticate latest-release checks with GH_TOKEN / GITHUB_TOKEN , and fall back from an exhausted GitHub API quota to the public releases/latest redir
GH_TOKEN / GITHUB_TOKEN, and fall back from an exhausted GitHub API quota to the public releases/latest redirect. Apply the same redirect fallback in the one-line installer so an HTTP 403 does not falsely block an otherwise current installation.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 | bash
Installs/updates:
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,agents,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
checksums.txt lists sha256 for every asset above.
Make easyeda update --check --exit-code an exact GitHub-latest Agent-session gate for the CLI, installed Skill, running daemon and every connected Con
easyeda update --check --exit-code an exact GitHub-latest Agent-session gate for the CLI, installed Skill, running daemon and every connected Connector. Ahead, development, unknown, disconnected and stale states now block; Skill upgrades require ending the loaded Agent session and starting a new one before EDA work resumes.~/.agents/skills/easyeda-agent) in installer detection, version reports and atomic Skill updates.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 | bash
Installs/updates:
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,agents,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
checksums.txt lists sha256 for every asset above.
Document the current Altium Designer project-import boundary: use EasyEDA Pro's GUI for .SchDoc / .PcbDoc , treat the beta API's undefined /no-op resu
.SchDoc / .PcbDoc, treat the beta API's undefined/no-op result as failure, and verify imported schematic, PCB outline and mechanical-layer data before continuing (#203).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 | bash
Installs/updates:
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.
Keep the DSH bundle version aligned with this release and publish to SkillHub using its environment token without writing a runner credential file.
Keep the DSH bundle version aligned with this release and publish to SkillHub using its environment token without writing a runner credential file.
Verify explicit resistance queries numerically before ranking parts; preserve milli/mega prefixes and reject matches inferred from MPN digits. Add Skill guidance to retain parameter sources and verify manufacturer-specific value codes (#202).
Skip rotation calibration when connecting a native schematic net label, which has no rotation parameter. The host's EDA v4 label API remains pending on the tested 3.2.186 host; this does not claim native-label compatibility is fixed (#191).
Resolve DSH MCP and Skill file URLs with Node's fileURLToPath, preserving Windows drive/UNC paths and escaped characters (#201); add cross-platform path and native-launch CI tests.
Pass the officially resolved split-screen ID when opening documents, avoiding PCB reopen hangs observed after closing a tab on EasyEDA 3.2.186; do not report ready when the active document is still different.
Keep PCB document and board metadata readable after mutations so doc reload can recover stale primitive reads; metadata reads do not clear the stale-read gate.
Fix PCB silk text creation: use registered default font and legal LEFT_TOP alignment in free text, net names and pad labels; empty font / alignment 0 was rejected by EasyEDA 3.2.186.
Let an exact --doc UUID use matching live document/result context without depending on the PCB name catalogue. Reject inconsistent project, document or type evidence.
Recover an active PCB missing from document enumeration using official current-PCB information, requiring matching project/document identity before accepting the name (#190).
Accept action request bodies up to 32 MiB for base64 3D model imports (#199); test the exact limit and one-byte overflow.
Add sch modify --patch-file and pcb modify --patch-file for PowerShell 5.1 JSON quoting failures (#192). Accept UTF-8 BOM files, reject conflicting inline/file sources and non-object JSON before dispatch, and preserve explicit schematic flag overrides and PCB center guards.
Document native net-label API compatibility limits and readback requirements (#191).
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 | bash
Installs/updates:
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.
Calculate reusable schematic Lib circuits from canonical nets and measured pin geometry, then compose compact Z-order pages with independently sized f
esp32MiniRequire.md requirement-to-four-layer-PCB regression was not rerun for this maintenance release.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 | bash
Installs/updates:
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.
Introduce the 1.4 schematic connectivity IR: stable component IDs, separate display references and functional roles, complete pin/net/NC records, and
sch compose into guarded, sequential sch apply queues. Support compact Z rows, fixed margins, pink dashed frames with 0.2-inch titles, and collision-checked straight terminal leads with staggered lengths.sch designators allocate/plan/verify: preserve valid references, allocate invalid functional names from official library prefixes, and verify instance identity, geometry and wiring before and after an in-place repair.make release-check and make release-build, version/asset verification, and a tracked-file Skill packager shared by release channels.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 | bash
Installs/updates:
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.
Reject placed-instance UUIDs before schematic materialization so an invalid 16-character ID cannot hang the EasyEDA connector queue ( #196 ).
debug.exec_js asAlready 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:
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.
easyeda-agent v1.4.1 (internal preview) Pre-release
Pre-release
Compare
Reject placed-instance UUIDs before schematic materialization ( #196 ).
debug.exec_js results as base64.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:
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.
Add typed library.model3d.search and library.model3d.copy actions for selecting existing library models without UI automation.
library.model3d.search and library.model3d.copy actions for selecting existing library models without UI automation.library.device.set_model3d with exact Device-name preflight, model existence checks, bind/replace/clear support, and association readback verification.easyeda lib model3d search/copy and easyeda lib device model3d.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:
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.
Fixed — README 演示图改回包内相对路径(1.2.9 换版本号重传未解决,定位到真因)
1.2.9 曾假设「市场服务端处理 README 偶发失败,纯换版本号重传即可」——这个
诊断错了。1.2.9 重传后逐字节 diff 市场存的 readme 字段与本地文件,发现除
三张图片行被整行删除外其余文字一字不差,不是粗暴的解析失败,是精确命中
这三行。扫了市场上 100+ 其它插件的 README(同款 image.lceda.cn 图床、同款
排版),image.lceda.cn 绝对链接普遍工作正常,排除了「服务端偶发抽风」。
真因转向:README 里硬编码的三个 image.lceda.cn URL 不是本次上传产生的
——是半年前 0.23.0 那次转存时铸造的老链接,此后一直复用到 1.2.9。怀疑市场
对图片 URL 做了版本归属绑定,渲染当前版本时把「挂在旧版本记录下」的图片
引用当滤除对象。改回包内相对路径 images/demo-*.png|gif,让市场重新执行
「README 抽图 → 转存图床 → 改写链接」流程,为当前版本铸造全新 URL。
与 0.24.0 那次「相对路径抽图失败」的教训不冲突:那次是抽图步骤本身
出错(readme 字段整体缺失);这次绝对链接能正常返回图片,只是被
精确摘除三行,指向的是版本归属过滤而非抽图失败。若这次相对路径重新
抽图又失败,再退回绝对链接但换成全新图床 URL(而非复用旧链接)。
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:
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.
Fixed — 旋转探测旗删不掉就漏在画布上,拖垮 sch gate --strict
sch gate --strictdetectRotationNegation() 为测平台的旋转语义(createNetFlag 在某些 build 上存储
取负)会在离画布极远处造一支一次性探测旗 __ROTPROBE__,读回 rotation 再删掉。
那句 delete 没有回读验证 —— 而「删除撒谎」是本仓在别处早已按批处理 + 回读
兜住的平台已知病(delete 返回真值而图元仍在);delete 抛错还会被 catch 吞掉。
一旦撒谎,探测旗就永久留在画布上。
代价不在电路,在判据:sch bridge-check 把它算成一条 orphan-flag,于是
sch gate --strict(S5 逐页门用的就是它)在一块电路完全正确的板子上 FAIL
(2026-08-26 esp32MiniRequire 端到端实测,POWER 页)。
现在 delete → 回读 → 重试(至多 3 轮),仍在就经 eda.sys_Log 明着记一条并附上
清理命令 —— 沙箱里 console 是死代码,sys_Log 是唯一诊断出口。
daemon 侧另有一层收口(
sch_tool_probe_residue.go):按网名把探测残留归类成
「工具自己的垃圾」,不计进板子的 orphan 账但照常报出 + 给清理命令。那一层对
已经装好的旧连接器立即生效;这一层才是治本。
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:
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.
1.1.2 从未发版(无 tag),它的条目并入本版。 升级方式 :CLI/skill 跑 easyeda update ; 连接器 sideload 必须手工重导入 (同 uuid 更新要先在「已安装」里卸载旧的,导入后完全退出并重启 EasyEDA)。
1.1.2 从未发版(无 tag),它的条目并入本版。
升级方式:CLI/skill 跑easyeda update;连接器 sideload 必须手工重导入
(同 uuid 更新要先在「已安装」里卸载旧的,导入后完全退出并重启 EasyEDA)。
CLI / daemon / 连接器三方版本对不上时,easyeda health 给出 versionGate 判定,
后续动作在 /action 层被直接拒绝并附修法,而不是让人先怀疑电路或工具坏了。
明知故犯的逃生口是 --skip-version-check(会写审计)。
modules[].parts 写的是 designator,而平台会在 create 时按自己的全局位号重编
(计划 C1 → 落地 C11)。位号对不上不会报错,只会让分区打分/连接器规则静默少算
一个模块。现在 sch block-apply --spec <s0.json> 落块即回填,或事后
easyeda spec backfill … --write;写入是外科手术(只替换那一段字节,键序/缩进/
未知字段一个不动),任一模块定位不到就整体拒写。
--force-stale-read:STALE_READ 的逃生口从「不存在的 flag」变成真的此前拒绝消息里印着一个并不存在的 flag,照抄跑不通。现在它是真 flag,带理由入审计,
且只放 PCB 读、解不开布线阶段门。
真机连续四次「连接器在负载下停摆」查到底了,根因不在重连、不在 WebSocket、也不在
daemon,而在主线程 setTimeout 在后台窗口里被节流/冻结,于是连接器所有基于
setTimeout 的守卫(FIFO 的放弃闸 22s、每次平台调用的 withTimeout 7s)到点不响。
证据(2026-08-24 三份 daemon 日志 + 审计逐条对齐):
schematic.power.connect_pin 进入 FIFO 队首,队列一动不动 6 分钟;document.current 每次 12ms 就回 —— WS、主线程、eda.* 桥全都活着;schematic.pages.list(本身 p50 只有 15ms)每条各烧满 18sEDA_* 而不是 ACTION_ABANDONED —— 三份日志与全部审计ACTION_ABANDONED 出现 0 次:放弃闸自上线以来一次都没响过。修法:新增 src/deadlines.ts,把所有「到点必须发生」的守卫登记成绝对时刻,
setTimeout 只当快路径,worker tick 的 sweepDeadlines() 是保底路径 —— 那是本
进程里唯一被真机证明不受后台节流影响的时基(看门狗当初正是为此搬进 Worker 的,
只是队列和 per-op 守卫被落在了老路上)。action-queue 的放弃闸与 actions.ts 的
withTimeout 一并改用它。保底路径的分辨率是一拍(3s),所以短守卫最坏晚一拍触发
——远好过晚六分钟。
行为变化:队首卡死时,连接器现在会在 timeoutMs + 2s 真的放弃它并回
ACTION_ABANDONED,队列继续流动。收到这个码 = 那次写的效果可能稍后才落地,
关于它的任何结论都不成立(seqAbandoned 已递增),必须回读复核后再决定,不要盲重试。
spec backfill / 分区打分把死页算进分母。新增 easyeda workflow pages --reap--prune(清数据);核销后的页会被 WARN 点名并明确排除出分母。--at 更远,挤的时候跑 sch clusters 看组间压没压到。两个内容分得开、只是版面余量对撞的区,现在直接画得出框。真画不出时报文给出逐条
最小位移(sch zone move --zone X --dy +N)。版面知识:竖着叠的两个功能区之间要留
≥96 单位(24 边距 + 42 说明带 + 30 区名带),横着排的贴着放也画得出框。
missing-partition 改看画布而非本地记账说明带的三把尺收敛成一把;sch check 的分区判据改由画布上的区标题文本作证
(与 zone-draw 生成标题同一个函数),消除「画布上明明有框、check 永远说没有」的恒报。
同时新增 page-too-small 判据:块/组比整页可用区还大时停手交回用户(拆页是设计决策,
工具不自动分页)。
一次广度优先的端到端(esp32Mini 固定用例)记了 19 条挂账,完整台账见仓库
docs/e2e-round-2026-08-25-findings.md。升级前值得先知道的三条:
sch group-move --ids 报「电气自检失败」却不回滚:位移照样落地,留下悬空脚 +✗ 不要当作没发生,先 sch bridge-check 复核画布。sch group create + --group,或 disconnect → modify → connect。sch destagger --apply 在相邻引脚场景仍会共线合并成短路,且「已按快照自动恢复」sch bridge-check 验一遍。sch gate --strict 目前无法出 verdict=pass:missing-titleblock 的唯一处方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:
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.
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:
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.
本版把 1.0.3 – 1.0.5 三个未发布的中间版本一并放出。 minor 而非 patch,因为下面 第一条是行为破坏性变更 —— 升级后一批此前「能跑」的 PCB 读会开始报错。
本版把 1.0.3–1.0.5 三个未发布的中间版本一并放出。minor 而非 patch,因为下面
第一条是行为破坏性变更 —— 升级后一批此前「能跑」的 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(它仍只带--force-reason "<理由>",审计里记成 daemon.stale_read.force 伪动作行。pcb refine / sync-designators / import-changes /power-planes / power-pour / route-critical / autoroute / pcb clear /verify: 块)已逐条加上窄到一次调用的放行位,不受影响;而 refineSTAGE_BLOCKED 的拒绝消息也带上补门命令此前只说「see easyeda workflow status」,现在直接给出该跑哪条:
pcb stage confirm-tier / confirm-outline / pcb layout-lint --gate /
workflow advance,按缺的是哪道门决定。
copperLayerCount 读不到时不再静默按 2 层降级板子若在命令开跑前就脏,一块 4 层板会被当成 2 层,于是走 power-pour 而不是
power-planes,两条电源轨挤在同一层 —— 正是内电层要解决的那个冲突。现在会把降级
明确说出来。
见下方 [1.0.5] 条目全文。摘要:daemon 重启后的重连从「十几秒」降到 ~2-3s;
顺带修掉「SLOW_RETRY_DELAY_MS = 10s 因为看门狗每 3s 抢先调用而从未真正生效」。
license / compatibility / metadataskills-ref validate 通过;版本号随 make release 自动同步。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:
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.
Nothing published for this version
ADR-0004「挪动收敛为单一安全 move 内核」首批随版(源自 issue #181 两份 E2E 复盘)。CLI 侧:schMoveKernel 五步管线(快照→删证回读→snap 移动→快照重连→ 电气对账,失败自动恢复、目标页失效 fail-closed),group-move/zone
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)。连接器侧两条见下。
pcb.component.modify 解锁假成功(#174):平台 modify() 的真实锁字段是primitiveLock,而我们的读侧(pcb list)一直报 locked,调用方自然传{"locked":false} —— 平台静默忽略未知键仍返回成功(真机 22/22 报 ok、locked/lock 别名映射到primitiveLock,契约外的未知键硬报错(不再允许静默 no-op);verified + applied/notApplied/unverified;(3) 回读发现锁写被丢时setState_PrimitiveLock + done() 写路径(pcb.track.lock 验证过lockFallback:true);(4) 按 #151 部分应用约定:画布notApplied,零字段落地才报 ERROR。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:
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.
Nothing published for this version
连接器侧一条修复(见下);CLI 侧同批落地:artifact 目录递归嵌套归一、 --doc 对读命令生效、 board.rebind 目录补登记(UNKNOWN_ACTION 出口补审计)、 裸 sch connect 35s 预算 + 慢速落地复核(slowLanded)、 sch group
连接器侧一条修复(见下);CLI 侧同批落地:artifact 目录递归嵌套归一、
--doc 对读命令生效、board.rebind 目录补登记(UNKNOWN_ACTION 出口补审计)、
裸 sch connect 35s 预算 + 慢速落地复核(slowLanded)、sch group-move
半途失败自动重连恢复、sch note --zone 框满走廊落点、sch autoconnect
带痕候选 WARN + --strict。
schematic.pin.disconnect 假成功:此前删除只调 delete 后不回读,平台对disconnected:true(真机复现:R5:1 / R5:2 / C4:2 断开后网表仍连)。且坐标ok:true + partial:true + notApplied/survivedIds,disconnected 仅在全部证实消失时为 true,deletedWires/deletedFlags 只计证实删除的 id)并附 warnings;CLI sch disconnect 把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:
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.
里程碑:原理图功能正式上线(S0–S6 可交付)。 版本从 0.26.x 跃迁至 1.0.0, 连接器与 CLI/skill 同版(四件套同版约定)。0.26.1 未单独发布,其连接器变更 ( schematic.bridgeCheck 的 ORPHAN_TREE 悬空树判据,见下方 0.26.1
里程碑:原理图功能正式上线(S0–S6 可交付)。 版本从 0.26.x 跃迁至 1.0.0,
连接器与 CLI/skill 同版(四件套同版约定)。0.26.1 未单独发布,其连接器变更
(schematic.bridgeCheck 的 ORPHAN_TREE 悬空树判据,见下方 0.26.1 条目)随本版
一并发布。1.0.0 的主体变更在 CLI/skill 侧:三层布局体系(Sheet→Zone→Group,
分区框/区名/电路说明算法落位,生成与校验同一把尺)、sch gate --strict 五关
机械门禁、跨页网名审计 sch nets --strict、块对账 sch reconcile、netlist
黄金表逐脚比对;esp32Mini 真机端到端回归通过(3 页 / 26 件 / 18 网全对)。
连接器 0.26.x 与本版 CLI 协议兼容,但 orphan-tree 判据需本版连接器才生效。
Already installed? Upgrade in place:
easyeda update # CLI binary (sha256-verified) + skill dirs
easyeda update --check # report only
First install:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | sh
Installs/updates:
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.
Nothing published for this version
连接器侧无代码变更 —— 版本号随 CLI 同步(四件套同版约定)。本版全部变更在 CLI/skill 侧: sch zone-arrange (功能区确定性布局两段求解 + --apply 断言门)、 sch status / sch nets / sch reconcile / sch clus
连接器侧无代码变更 —— 版本号随 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:
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.
连接器侧无代码变更 —— 版本号随 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 完全兼容。
LICENSE 文件(GitHub 视角 = 版权
全保留,严格讲不是开源),声明只散落在 NOTICE/清单里且互相打架(根
package.json 写 MIT、连接器写 Apache-2.0)。现在补齐根 LICENSE(MIT),
extension.json 的 license 随之改为 MIT、package.json 改为 SPDX 复合
表达式 (MIT AND Apache-2.0)。例外:src/beautify/ 下四个文件移植自
Easy_EDA_PCB_Beautify(m-RNA),继续沿用 Apache-2.0 —— 无权改,也不必改(两者
兼容)。许可证全文放在 src/beautify/LICENSE,.eext 包内新增 extension/ LICENSE 承载 MIT 全文 + 第三方告知(dist/ 里含 beautify 的编译产物)。Nothing published for this version
修复立创插件市场审核驳回「README图片未加载成功,请检查存储路径」(0.24.0 被拒)。
修复立创插件市场审核驳回「README图片未加载成功,请检查存储路径」(0.24.0 被拒)。
images/demo-*.png|gif 改为 https://image.lceda.cn/extensions/images/...。.eext 时的「README 抽图 → 转存图床 → 改写链接」image.lceda.cn 绝对images/ 保留,./images/logo.jpg 不变)。One-line install/update:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | sh
Installs/updates:
Skill targets: set EASYEDA_INSTALL_SKILLS=codex,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
原理图布局体系定版:placement-first 区级重排( sch zone relayout )+ 串联链 共线串接 + 全员竖放平行对齐 + 顺方向 netport + 竖直旗真值表修正 + 三个新判据 (reversed-net-flag / marker-overlap 文字带 / re
原理图布局体系定版:placement-first 区级重排(sch zone relayout)+ 串联链
共线串接 + 全员竖放平行对齐 + 顺方向 netport + 竖直旗真值表修正 + 三个新判据
(reversed-net-flag / marker-overlap 文字带 / redundant-net-marker)。
连接器含 0.24.1–0.24.5 全部修复(合并线段对解析三处统一/orphan-stub 直连豁免)。
sch zone relayout —— placement-first 区级重排,用户点名的正确顺序)sch zone relayout --zone X [--apply]:与 zone tidy(挪带线的组)One-line install/update:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | sh
Installs/updates:
Skill targets: set EASYEDA_INSTALL_SKILLS=codex,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
Nothing published for this version
原理图能力大版:持久化编组 + 布局质量打分 + CLI 参数收敛(含 BREAKING)。 连接器侧含 0.23.1–0.23.3 的全部修复(见下)加本版的 group.move flag 支持与 schematic.snapshot 移除;CLI 侧新增见 repo commit 历史(fea
原理图能力大版:持久化编组 + 布局质量打分 + CLI 参数收敛(含 BREAKING)。
连接器侧含 0.23.1–0.23.3 的全部修复(见下)加本版的 group.move flag 支持与
schematic.snapshot 移除;CLI 侧新增见 repo commit 历史(feat/sch-zoned-layout-opt)。
sch group create/list/add/remove/ungroupsch group-move --group 成员桩线+标志自动展开随组刚移align/distribute 部分组硬拒绝(--break-group 放行)。sch layout-score 布局质量五维打分:折叠/反向/贴芯片距离/长链/框贴合,sch check 新增机械检查:missing-partition(多器件页未画分区框/说明,folded-net-label(netport 竖排折叠);autoconnect 打分器--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:
Skill targets: set EASYEDA_INSTALL_SKILLS=codex,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
Nothing published for this version
插拔类器件特性版(用户在车机真板复测中逐条点名):打分骂什么、规划器就修什么, 两边口径锁死不分家。全部真机验证(车机 J2 Type-C 从缩板内 129mil → 齐边 → 外突 40.7mil,板 74.0→75.4 [good] 0 blocking)。
插拔类器件特性版(用户在车机真板复测中逐条点名):打分骂什么、规划器就修什么,
两边口径锁死不分家。全部真机验证(车机 J2 Type-C 从缩板内 129mil → 齐边 →
外突 40.7mil,板 74.0→75.4 [good] 0 blocking)。
pcb layout-score --part J2,U1 —— 器件聚焦视角。整体归因是「维→器件」,--all 的数据层谎言:routable 在 scorer 内截前 12,现在 --all/--part 时各维保留全量归因。One-line install/update:
curl -fsSL https://raw.githubusercontent.com/zhoushoujianwork/easyeda-agent/main/install.sh | sh
Installs/updates:
Skill targets: set EASYEDA_INSTALL_SKILLS=codex,claude to force targets, none to skip, or EASYEDA_SKILL_PRESERVE=1 to keep local edits.
PCB 布局能力重构版(#167/#168/#153):多维打分 → 精修 → 确认门的闭环 + 规划器 合法化 + 五块嘉立创开源真板校准。
PCB 布局能力重构版(#167/#168/#153):多维打分 → 精修 → 确认门的闭环 + 规划器 合法化 + 五块嘉立创开源真板校准。
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 切有序带(只读)。pcb check
(+插头护套包络表 _plug_envelope.json),与 edge-io 维共用判定;位号优先于器件名
(USBLC6/SMAJ 不再被误判成连接器)。workflow status 消费质量快照:confirm-layout 落的多维快照渲染 + --reconcile
逐维退化对比(掉 ≥5 分标 ⚠;scored→skipped 报「失去可测性」绝不当 0 分)。make layout-calibrate 正负对照 fixture +
五块开源真板入库(实战派ESP32-S3 [maxBlocking=0 旗舰锚点]/庐山派K230/
RK3568四层/MIPI扩展板/BBClaw),好板不掉分+blocking 不误报回归机械可查。pcb.outline.get 返回板框真多边形 points + outlineFormat(#167,连接器侧)。
异形板「到板边距离」不再按 AABB 错算;points=折线中心线(铣刀路径=真板边),
bbox 是渲染范围含线宽。多条/含弧退化 bbox 并自述原因(消费方自动回落标 degraded)。`sch note` —— 电路说明文本(纯 CLI,zone-draw 同款内部 exec_js 惯例)。 用户反馈:agent 产出的原理图常一页塞满、无分区框、无文字说明,电气对但交付 可读性差。Skill 布局默认升级为「分页分区+电路说明」三件套:S1 分页(每页一个 功能域)、S2 分区
sch note —— 电路说明文本(纯 CLI,zone-draw 同款内部 exec_js 惯例)。
用户反馈:agent 产出的原理图常一页塞满、无分区框、无文字说明,电气对但交付
可读性差。Skill 布局默认升级为「分页分区+电路说明」三件套:S1 分页(每页一个
功能域)、S2 分区框+区名(sch zones set→zone-draw)、S3 每模块 1~3 行电路
说明(sch note --text "LDO: 5V→3V3 1A\n输入/输出各 100nF" --x … --y …,
\n 换行,字号默认 10/灰色低于区名标签)。创建后回读 primitiveId 验证 + 显式
save;sch text-list 枚举、sch prim-delete 清理。真机验证(ceshi):多行内容
完整落盘读回。约束落点:SKILL.md 档位默认表+停点② · design-flow S3 过门条件 ·
schematic-layout-conventions §1.5(含合格说明正反例)。attrs_backfill 灌库占位 Designator 键灭掉全板位号 —— 根因修复(此前误诊为平台行为)。
一块 166 器件的板 pcb import-changes 后位号 166/166 全变占位符(U?/C?/RF?),
最初归因于平台导入——错。真机控制变量二分(ceshi 六件小板)钉死真凶:裸
eda.pcb_Document.importChanges() + 手动点「应用修改」位号全对(平台无辜,还顺带
给两侧铸造 uniqueId);毁位号的是我们自己的 pcb.component.attrs_backfill
(import-changes 自动跑):器件库记录的 otherProperty 自带 Designator: "C?"
(库自己的占位位号),merge「填空值」把它灌进实例,平台把 otherProperty.Designator
同步成图元位号 —— 安静板上单独跑一次 sync-attrs 即 100% 复现,与时序无关,每件
变成各自库记录的占位前缀。修法三件套:merge 剔除平台投影键(Designator /
Unique ID / Name / Add into BOM / Manufacturer* / Supplier* —— 它们存在
顶层图元状态里,写进 otherProperty 要么被同步成状态(毁位号)要么被静默丢弃(报告
年年撒谎「6/6 backfilled」且永不幂等));同一 modify 显式回传当前位号兜底;
清洗老版本已漏进实例的占位 Designator 键。修后实测:全流程 E2E 位号全真、
sync-attrs 幂等(第二轮 0/6)、真实属性照常回填(Value/Tolerance/Voltage Rating)。pcb.components.list 补 uniqueId + 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 拿它当门,弹框未确认时照跑同步、读到
导入前的板面、静默空跑;现在未确认落地会明确警告并指引手动补跑。schematic.export.image —— 选区/整页导出 SVG·PNG·PDF(#166)。
easyeda sch export-image --ids '[...]' --out block.svg 把指定图元单独渲染出来
(自动选中并把画布裁到选区:实测 3 个器件 → 283×155,整页 1191×846),省略 --ids
导整页;--format svg|png|pdf、--scope selection|page|project、--page、--out。
这是 agent「看局部原理图」的可靠通路 —— 老路子 view region + snapshot --no-fit
依赖视口重绘,标签页不在前台时 rAF 不触发、画布不重画,于是静默截回上一帧整页
(#166 报的「仍截整页」真因在此,不是 #20 回归);新命令不走视口、不需前台、不弹框,
SVG 还是矢量。
⚠️ 底层 getExportDocumentFile 的 object 字面量,官方类型定义三个值全是错的
('All Schematic'/'Current Schematic'/'Current Schematic Page'),真值是
'Current Page'/'Current Page Selected Items'/'Project'(读 sch-main.js 源码实证)。
传错不报错:内部 Z.pureSchematics[<非法key>].sort 抛 TypeError、空 reject 无人接,
外层 promise 既不 resolve 也不 reject,编辑器卡在 1% 进度条(实测两次卡死)。
handler 固化真值并加 30s 超时兜底,绝不再让动作队列被悬着的 promise 占死。Nothing published for this version
(CLI/daemon) `go test` 不再把 fixture 写进用户真实审计日志(#159): newAuditWriter("") 兜底到 ~/.easyeda-agent/audit,而 daemon 测试里的 New(Options{}) 都不设 AuditDir —— 每个走 ha
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 的新测试再也污染不到用户日志(结构性防漏,不靠纪律)。waitDocSettle 对 PCB 文档不再空转 8s(#161):settle 探针写死
schematic.components.list,--page 指向 PCB 时探针必然失败,而失败被吞成
「继续轮询」→ 审计日志 21 连发 EDA_CALL_FAILED、ready 恒 false。现在
探针按文档类型选(pcb → pcb.components.list),守卫下沉到探针本身而不是
指望每个调用方记得判断(doc switch 有守卫、switchToPage 没有,漏一个就复现);
连续 3 次探针失败即止损。实测 21 连发 → 0,8s → 3.4s。sch zone-draw 框贴图纸边缘并压标题栏 keep-out(#163):zones 模式在
原始 sheet bbox 上分格且只内缩 4 单位,底排落在标题栏 x 范围内的格直接压进
明细表 —— zone-draw 画的框会触发我们自己的 titleblock-overlap 规则,而 keep-out
几何一直是现成的(deriveSheetGeometry,partition 模式和 sch check 都在用),
zones 模式只是没消费它。现在先按 margin(默认 20)内缩出可用区再分格,并把与
keep-out 相交的框底边抬到上沿 + 8;标签移入框内不再压框线;收缩后过短的格跳过
不画残条。真机(A4 1170×825 / keepout [468,0→1170,165]):整体由 x[4..1166] y[4..821] 收到 x[24..1146] y[24..801],底排底边 4 → 173,titleblockOverlaps: 0。errorDetail 不再被折叠成 [object Object](#160):edaError 用
String(err) 渲染抛出物,平台抛裸对象时根因整条丢失(实测 debug.exec_js
两条只剩「有个对象」)。而 errorDetail 存在的唯一理由就是承载 eda.* 的
原始抛出物(titleblock.modify 0/32 那次复盘只能靠 payload 反推)。新增纯函数
describeThrown:Error→message(空则 name)、对象→[code] message | {json}
(可读部分在前,截断也留得住)、循环引用标 [Circular]、无可枚举属性直说
——替换 actions.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。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 不重写。Nothing published for this version
显示名改为 EDA Agent Connector 后重传立创市场(包名与 uuid 均不变)。 按市场管理规范,displayName 去除 "easyeda" 字样;经与市场管理员确认,内部 包名 easyeda-agent-connector 与 uuid 无需改动,原条目撤销已解除,同一 条
displayName 去除 "easyeda" 字样;经与市场管理员确认,内部
包名 easyeda-agent-connector 与 uuid 无需改动,原条目撤销已解除,同一
条目重新上传即可——已装用户的原地自动更新不受影响,无需任何操作。
README(中/英)/包内 README/install.sh 均已附更名说明。Nothing published for this version
`schematic.read` 的 components 输出漏了 `primitiveId`(真机事故,motobox): read 只输出 uniqueId(gge…,sch↔PCB 关联键),agent 抓它当改动句柄喂给 select / delete / modify → 全部 notF
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 输出一致,按它删除成功。`schematic.component.replace` 已随 0.20.0 发布;本版补齐它牵出的整条「器件标准化」链路(见下)。
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 清零。<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)。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)。`schematic.component.replace` —— 整器件替换(换型号),官方「器件标准化」面板 「使用推荐器件」的 API 等价物(该面板仅暴露打开面板的枚举,零数据/操作 API)。 官方无 rebind-device 原语,走 delete → 同位姿 create → 恢复位号
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 对象立即回读是恢复前的陈旧值)。publisher easyeda-agent→zhoushoujian;name
easyeda-agent-connector→eda-agent-connector;displayName →"EDA Agent Connector";
description 与编辑器菜单标题同步改写;仅保留 GitHub 仓库 URL(事实链接)。
uuid 不变,已装用户仍走原地更新;v0.19.0 GitHub Release .eext 资产已替换为修正版
(回验:包内除 URL 外 0 处 easyeda 字样)。打包产物文件名随 name 变为
eda-agent-connector_v*.eext(Release 资产名保持 easyeda-agent-connector.eext
不变,install.sh 依赖它)。> —— 首个外部贡献:定位并修复了「同窗口重复激活互踢 socket」的重连风暴,并带来了 MCP stdio 适配层。
🙏 感谢 @NeoSpecies 的 PR #154 —— 首个外部贡献:定位并修复了「同窗口重复激活互踢 socket」的重连风暴,并带来了 MCP stdio 适配层。 本版连接侧的三层修复(activation-scoped id / 失败轮换 / 端口记忆)正是在这个 PR 的基础上叠加完成的。
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。NO_CONNECTOR「没有连接器」。现在 daemon 记住退役窗口的稳定身份
(documentUUID 最强判据/project 兜底),自动路由到接替窗口并在 warnings 里告知新 id;
无法重定向时报 STALE_WINDOW(明说连接器是好的,列出在线窗口,建议 --project)
或 AMBIGUOUS_WINDOW(列候选),NO_CONNECTOR 只留给真没连接的情况。scripts/audit-baseline.py —— 暴露面健康度离线体检:读 audit log 出「调用分布+失败率 /
错路回退 / 逐日多样性」三张表;首测揪出 titleblock.modify 32 次调用 0 次成功。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。修复 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:false。
alreadySet(改前就等于期望值)不计入 applied、也不豁免全失败硬门。
unknownKeys 是本 action 特有的诊断:那些根本不是明细项,修法是换 key 而不是重试——
明细表改不了纸张尺寸。SDK 显式返回 false 也不再被吞。9 个单测覆盖上述每一条。
audit log 记录 errorDetail —— 协议 Error.Detail(连接器捕获的平台原始报错)此前
被丢弃,日志里只剩我们自己的包装文案(如 "Failed to modify schematic page title block."),
事后定位根因无从谈起:上面那条 titleblock 的调查只能从 payload 反推。现在原始错误一并落盘。
`pcb layout-lint` 新增跨网短路检测(`short` ERROR)—— 从「靠太近」升级到「这两网短路」: 两器件 bbox 相交时进一步比焊盘铜皮矩形,若两块铜在共享层上真的压在一起且分属不同 网络,报 ERROR short C2.1[VBAT_RAW] ↔ D2.2[SW1_N
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 的数据就够算。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,与人工重算真值一致。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 同步补充。安装脚本更新 skill 不再产生 `.bak` 备份、污染 skills 目录:install.sh 的 install_skill_to 从「先 mv 成 easyeda-agent.bak.<时间戳> 再拷新版本」改为 干净替换——检测到本地 skill 与 release 不一致时直接 rm
.bak 备份、污染 skills 目录:install.sh 的
install_skill_to 从「先 mv 成 easyeda-agent.bak.<时间戳> 再拷新版本」改为
干净替换——检测到本地 skill 与 release 不一致时直接 rm -rf 旧目录再 cp 新版本,
不再在 ~/.claude/skills / ~/.codex/skills 下留一堆过期备份副本(备份目录会被 skill
加载器扫到、误加载旧内容)。需要保留本地改动的用户仍可用 EASYEDA_SKILL_PRESERVE=1
跳过覆盖。sch zones 认领与 fixed/partition/
autolayout 三条绘框路径统一按 documentUuid 持久化(旧 schZones/单 frame 记录仍可读);
fixed 模式开放 --font-size(默认 14pt)。重画/清除会回读 rectangle/text ID,任何 survivor
都失败并保留恢复记录;创建数量须 1:1,部分创建自清理;成功画/清均显式校验
schematic.save(saved:true),避免孤儿文本和跨页误删。Nothing published for this version
电气检查(连接器 schematicCheck)看不见纯几何缺陷。新增三条 Go 侧规则,消费 components.list --include-bbox 已流入的真实 bbox/锚点(零连接器改动、纯离线单测可验收):
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 天然相交)。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 数据单测。scoreCandidate 里图签命中从 costTitleBlock=10000 改
costHardReject,四方向全进图签时明确失败,否则主动转向安全方向(不再把 netport 落进明细表)。acReport 加 partial/succeeded/failed,批量中断后只补失败 pin,
不重放整份 spec(避免在已连 pin 上叠重复标识)。labelBox 从固定 8×8 换成贴近实测的 marker 框
(~24×11);旧 8×8 在 10-pitch 平行脚永不与邻居相交、stagger 从不触发,真实 11-高框相交 →
规划器自动挑不同 offset 错开。真机 ch340c:相邻 GND 脚 offset 交替 18/36,marker-overlap 24-28→9。deriveSheetGeometry 的 A4 横版比例只有 {0.22,0.14} → keep-out (912.6,0)..(1170,115.5)
只覆盖图签右半的日期列,左半(原理图/Schematic1/Board1/ceshi)全露在外。所有吃这个 keep-out
的检查(#147 硬拒绝/门、#149 分区抬升、#141 避让)一致误报「0 覆盖」而真实图签左半持续被压。{0.6,0.2} → (468,0)..(1170,165) 完整框住整表。isA4LandscapeSize,
非 A4 A 系列横版(A3+)仍给 best-effort keep-out 但降级 source:fallback-ratio + warn「calibrated
for A4 landscape only」,让非 A4 的 keep-out 永不被当硬门静默信任。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。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 一致性待活体编辑器验收。sch autolayout --engine template --apply 落完自动 zone-draw:此前功能分区可视化
(虚线区域框+区名)是 sch zones set + sch zone-draw 两步手动跟进;现在模板引擎 --apply
成功后,按 --spec 的 modules[].zone 自动持久化分区认领(SetSchZones,sch zones status/
layout-lint 可见)并用与 zone-violation 同一 zoneRect 几何画出区域框+区名——「先看区、
再看线」成为放置流程一等公民。复用既有 buildZoneDrawJS,frame primitive id 记入 workflow
state,sch zone-draw --clear 精确移除、不碰用户图形。新 flag --zone-draw(默认开,
--zone-draw=false 关闭);无 sheet bbox / 无 zoned module 时静默跳过,best-effort 不影响布局。
纯函数单测覆盖(TestBuildAutolayoutZoneClaims);真机「多块页自动出现分区框」待活体编辑器验收。
block-apply 的 category→zone 自动分区 + 去耦分组文本注释(需先定 category→zone 映射/default_zone
方案)留作后续,不在本次范围。--engine official 兜底增强 (issue #143)connect_pin 网格判定容忍浮点残差:吸附把件 anchor 修到整 5 格,但引脚坐标 = anchor +
旋转偏移,旋转数学引入 FP 噪声(引脚落 649.9999999 而非 650),旧的严格相等网格判定把合法引脚
误判为 off-grid 而拒连(官方 --rewire 残留 ~7 条失败连接)。现引入 GRID_EPS=0.01:先 round
到最近格、与网格点距离 <0.01 即视为 on-grid;并把桩的引脚侧顶点吸到整格(pinGX/pinGY),使
短桩真正轴对齐(0.0001 的斜桩会让 flag 悬空/EasyEDA 拒建)同时仍 <0.01 贴合真实引脚→照常连通。
GRID_EPS 远 < 半格,真正 off-grid(半格 2.5)仍正确拒绝。顺带修好 offset==0 重叠检查(旧逻辑
在 FP 引脚下漏判)。autoLayout 喂 designatorDeviceTypeMap:此前裸调无参;现从页面真实位号前缀分类
(R→resistor / C→capacitor / L·FB→inductive / D·LED→diode / Q→triode / Y·X→oscillator /
U·IC→chip / 其余→otherDevice)构建 designator→type map 注入,官方算法按角色更聚拢地摆放。空 map
降级为裸调;传多余 props 对忽略它的旧构建无害。Go 单测覆盖分类器 + map 构建;真机连通率/布局效果
待活体编辑器验收。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 不与图签相交待活体编辑器验收。Nothing published for this version
`pcb.silk.import_svg` / `pcb silk-import-svg`:把 SVG(LOGO / 品牌标 / 图形)作为填充 丝印图元导入(eda.pcb_PrimitiveImage.create)——无需 `debug.exec_js` 的 typed 路径。新增 Go 侧
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,不再分发)。块 `schematic_layout` 模板:电路块 JSON 新增 schematic_layout(role → {dx,dy,rotation} 相对坐标模板,y-UP、5 格对齐、须覆盖全部 role,schema + go test 双校验)。sch block-apply 优先按模板落
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(查重叠)。定位:模板未命中页的兜底起点。--doc <uuid|name> 全局 flag:根治 doc-switch racing。所有命令默认对"当前前台文档"操作而
doc switch 异步,长命令(autoLayout ~2min)/跨命令时前台漂移会把编辑落到错误的页。--doc 在
postAction 咽喉点加守卫:变更动作(catalog Mutates)落地前 ensureActiveDoc 切目标页并用实时
document.current 确认(不看缓存 /health),确认不了拒绝而非编辑错页;导航动作豁免防递归。
真机验证:前台停 P2 时 block-apply --doc P1 稳稳落 P1、P2 不动。多页/长操作一律带 --doc。zoneRect
的 top/bottom 映射(此前按 y-DOWN 写反,autolayout/zone-violation/zone-draw 上下翻转)、标题栏
keep-out 锚点(此前保护右上角,实际标题栏在右下)、sch align --mode top/bottom 语义。Your coding agent can read these notes before it upgrades. Set up the MCP server →