skill
EDA Bridge Standard: one way for an AI to drive every PCB tool
Public Made by Adomby adom
The standard every Adom EDA bridge follows so one AI can drive Altium, KiCad, Fusion 360 and any future PCB tool the same way: shared verb names in tiers, the board model JSON, reply and refusal conventions, and a coverage table of each bridge against the Altium reference.
← Commit history
standard 0.8.0, engine 0.5.0: wire generate_body (PR #2, #20) into the writers: STEP AP214 from a package family and its JEDEC letters (pins the total, D2/E2 the exposed pad), matching Fusion's generator on 0603, SOIC-8, QFN-32 and QFP-48
8 files changed
+15−9
README.md+4−1@@ -44,7 +44,8 @@ links the crate (vendored at a tagged standard version, since Cargo cannot fetch answers each check under its own prefix. It now answers `copper_balance`, `return_path`, `fab_check`, `impedance`, `current_capacity`, `height_check`, `placement_check`, `thermal_vias` and `via_fence`, moved over from the Altium bridge (all but the via plans give the same answers as the Altium bridge on its test boards). It also-carries board-file writers (`export_gencad`, `export_dxf`, `import_svg`) for a bridge whose tool has no native exporter. Its+carries board-file writers (`export_gencad`, `export_dxf`, `import_svg`, `generate_body`) for a bridge whose tool has no+native exporter. Its conformance tests read a bridge's saved replies from `ADOM_EDA_FIXTURES`; fixtures live on each bridge's own page (Altium's: [adom/altium-bridge](https://wiki.adom.inc/adom/altium-bridge) `fixtures/`). @@ -157,6 +158,8 @@ Decisions so far (proposals from the KiCad and Fusion bridges, 2026-10-27; issue ## Status +Version 0.8.0: the engine (0.5.0) writes a part's 3D body as STEP from its package dimensions (`generate_body`, from the+Altium bridge's body3d.rs, PR #2, #20); it matches Fusion's generator on a 0603, SOIC-8, QFN-32 and QFP-48. Version 0.7.1: the engine (0.4.1)'s `placement_check` lists a part under a raised one (an Adom molecule on pins) as `stacked`, not as a courtyard overlap, when their pads stay apart and no bodies meet in 3D (fusion-lane #19). Version 0.7.0: the engine (0.4.0) adds `height_check` and `placement_check` from the Altium bridge, reading the 3D bodies
engine/Cargo.lock+1−1@@ -4,7 +4,7 @@ version = 4 [[package]] name = "adom-eda-checks"-version = "0.4.1"+version = "0.5.0" dependencies = [ "roxmltree", "serde_json",
engine/Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "adom-eda-checks"-version = "0.4.1"+version = "0.5.0" edition = "2021" description = "The EDA Bridge Standard's checks and board-file writers, computed from the board model JSON: no bridge calls, no tool." license = "MIT"
engine/README.md+2−1@@ -38,6 +38,7 @@ regions, with `writtenFrom`, and the bridge writes the file or places the region |---|---|---| | `export_gencad` | board | GenCAD 1.4 text, in inches: outline, pads and padstacks, shapes, components (a bottom part `MIRRORX FLIP`, as KiCad writes it), devices, signals, routes | | `export_dxf` | board, pours? | one DXF (R12) per layer in `args.layers`: Edge.Cuts as lines and arcs or one closed polyline (`contours`), copper as tracks, arcs, pads, vias and pours. With `pours` a copper layer shows the copper actually poured; without, `poursAsDrawn` names the layers that show the pour as drawn |+| `generate_body` | args only | a part's 3D body as STEP AP214 text from its package family and JEDEC letters (`family`, `dimensionsMm` with `pins` the total pin count and `D2`/`E2` an exposed pad, `marking?`), plus its box in the bodies companion's form; families chip, soic, qfn, qfp, sot23, dfn, bga, melf, ecap, crystal, header (#20) | | `import_svg` | svg (text) | `regions` in board mm (y up) for a layer: each shape with its holes as one contour reaching the holes through zero-width slits | ## Input@@ -88,7 +89,7 @@ adom-eda-checks import_svg --svg logo.svg --args '{"at": [10, 10], "widthMm": 20 Replies keep the standard envelope (`success`, `errorCode`, `error`, `_hint`) and name verbs without a prefix (`apply_pours`, `add_rule`, `place_vias`): a bridge adds its own. Every reply also carries `engine`-(`"adom-eda-checks 0.4.1"`), so a bridge reports the engine it runs without writing the version by hand.+(`"adom-eda-checks 0.5.0"`), so a bridge reports the engine it runs without writing the version by hand. ## Tests
engine/src/writers/mod.rs+4−2@@ -1,15 +1,16 @@ //! Board-file writers for a bridge whose tool has no native exporter (EDA Bridge Standard #16): GenCAD and DXF from the-//! board model, and SVG artwork as regions for a layer. Like the checks, no I/O and no tool: each returns the file text+//! board model, SVG artwork as regions for a layer, and a part's 3D body as STEP from its package dimensions (#20). Like the checks, no I/O and no tool: each returns the file text //! or the regions as JSON, says it was written from the board model (`writtenFrom`), and the bridge writes the files or //! places the regions. A bridge whose tool has a native exporter keeps it. use serde_json::Value; +pub mod body3d; pub mod dxf; pub mod gencad; pub mod svgart; /// The verbs these writers answer, by standard name.-pub const WRITERS: &[&str] = &["export_dxf", "export_gencad", "import_svg"];+pub const WRITERS: &[&str] = &["export_dxf", "export_gencad", "generate_body", "import_svg"]; pub use dxf::dxf_layers; pub use gencad::gencad;@@ -20,6 +21,7 @@ pub fn run(verb: &str, input: &Value) -> Option<Value> { Some(match verb { "export_dxf" => dxf_layers(input), "export_gencad" => gencad(input),+ "generate_body" => body3d::generate_body(input), "import_svg" => svg_to_regions(input), _ => return None, })
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "eda-bridge-standard",- "version": "0.7.1",+ "version": "0.8.0", "type": "skill", "title": "EDA Bridge Standard: one way for an AI to drive every PCB tool", "description": "The standard every Adom EDA bridge follows so one AI can drive Altium, KiCad, Fusion 360 and any future PCB tool the same way: shared verb names in tiers, the board model JSON, reply and refusal conventions, and a coverage table of each bridge against the Altium reference.",
verbs/coverage.json+1−1@@ -1,5 +1,5 @@ {- "standard": "0.7.1",+ "standard": "0.8.0", "reference": { "bridge": "altium", "version": "0.2.79"
verbs/standard.json+1−1@@ -1,5 +1,5 @@ {- "standard": "0.7.1",+ "standard": "0.8.0", "reference": { "bridge": "altium", "version": "0.2.79"