← Commit history
Cargo.lock+1−1
@@ -4,7 +4,7 @@ version = 4  [[package]] name = "adom-lbr"-version = "1.1.2"+version = "1.2.0" dependencies = [  "anyhow",  "clap",
Cargo.toml+1−1
@@ -1,6 +1,6 @@ [package] name = "adom-lbr"-version = "1.1.2"+version = "1.2.0" edition = "2021" description = "EAGLE .lbr generator, linter, and validator for Fusion 360 Electronics. Converts KiCad symbols + footprints to complete EAGLE libraries." 
README.md+5
@@ -48,6 +48,11 @@ adom-lbr bind-3d --lbr part.lbr --wip-urn "urn:adsk.wipprod:fs.file:vf.<id>?vers → **Full walkthrough: [docs/fusion-export.md](docs/fusion-export.md)** — pad-mapping, the verified 3D markup, the bridge attach vs. the `bind-3d` fast-path, and Altium/OrCAD notes. +📘 **Companion skill: [Adom LBR Fusion 360 Export](https://wiki.adom.inc/adom/adom-lbr-fusion-export)** —+a focused field guide to the four Fusion-export traps (placeholder footprint, the+bridge attach, `wip_urn` vs `eagle`, `dm.lineage`). It installs automatically with+this app (it's a dependency), and surfaces on its own when you're exporting to Fusion.+ ## The 3-column library viewer — and an interactive embed  ![The Fusion-style 3-column viewer: symbol, footprint, 3D, and the pin→pad mapping table](docs/viewer3col.png)
VERSION+1−1
@@ -1 +1 @@-1.1.2\ No newline at end of file+1.2.0\ No newline at end of file
bin/adom-lbr
⋯ 1 unchanged line ⋯
package.json+4−2
@@ -1,9 +1,11 @@ {   "slug": "adom-lbr",-  "version": "1.1.2",+  "version": "1.2.0",   "type": "app",   "description": "Symbol, footprint and 3D side by side with the pin to pad map and datasheet descriptions, exportable as one embeddable file.",-  "dependencies": {},+  "dependencies": {+    "adom/adom-lbr-fusion-export": "*"+  },   "tags": [     "eda",     "kicad",
page.json+4−2
@@ -1,9 +1,11 @@ {   "slug": "adom-lbr",-  "version": "1.1.2",+  "version": "1.2.0",   "type": "app",   "description": "Symbol, footprint and 3D side by side with the pin to pad map and datasheet descriptions, exportable as one embeddable file.",-  "dependencies": {},+  "dependencies": {+    "adom/adom-lbr-fusion-export": "*"+  },   "tags": [     "eda",     "kicad",
screenshots/hero.png
⋯ 1 unchanged line ⋯
src/main.rs+40
@@ -624,6 +624,28 @@ fn parse_mod_pads(km: &str) -> Vec<ModPad> {     pads } +/// One-line summary of a footprint's pad distribution for a moment-of-use hint,+/// e.g. "64 pads: 16 left / 16 right / 16 top / 16 bottom". Buckets by dominant+/// axis so a QFP reads as 4-sided and an SOIC/dual reads as left/right.+fn footprint_side_summary(fp_content: Option<&str>) -> String {+    let pads = fp_content.map(parse_mod_pads).unwrap_or_default();+    if pads.is_empty() {+        return "0 pads".to_string();+    }+    let (mut l, mut r, mut t, mut b) = (0u32, 0u32, 0u32, 0u32);+    for p in &pads {+        if p.x.abs() >= p.y.abs() {+            if p.x < 0.0 { l += 1 } else { r += 1 }+        } else if p.y > 0.0 { t += 1 } else { b += 1 }+    }+    let mut parts = Vec::new();+    if l > 0 { parts.push(format!("{l} left")); }+    if r > 0 { parts.push(format!("{r} right")); }+    if t > 0 { parts.push(format!("{t} top")); }+    if b > 0 { parts.push(format!("{b} bottom")); }+    format!("{} pads: {}", pads.len(), parts.join(" / "))+}+ /// Map a KiCad pad rotation (degrees) to an EAGLE `rot=` attribute, matching /// Fusion 360's own library export convention: the KiCad angle maps directly /// (KiCad 90 → `R90`), so a non-square pad on a QFP/SOIC top/bottom side is@@ -1245,6 +1267,24 @@ fn main() {             println!("OK: Generated {} ({} pins, {} bytes)", out_path.display(), parsed.pins.len(), lbr.len());             println!("HINT: Lint {} with {} error(s), {} warning(s)", if lint.passed { "PASSED" } else { "FAILED" }, lint.errors.len(), lint.warnings.len()); +            // Progressive, moment-of-use hints — surface the pitfalls right where+            // they bite, so an agent that never read the skill still does the+            // right thing. (Same idea as adom-wiki/adom-desktop `hint[…]` lines.)+            if fp.is_none() {+                println!("HINT: no --fp given → the package is a 2-COLUMN PLACEHOLDER, not the real footprint.");+                println!("      For anything you'll fabricate, pass --fp <part.kicad_mod> so pads land in their true positions.");+            } else {+                let sides = footprint_side_summary(fp_content.as_deref());+                println!("HINT: footprint built from the real .kicad_mod ({sides}).");+                if sym.is_none() {+                    println!("HINT: no --sym → the symbol was SYNTHESIZED from the footprint pads (balanced L/R). Pass --sym <part.kicad_sym> for the real schematic symbol.");+                }+                if model.is_none() {+                    println!("HINT: add --model <part.step> to also emit a Fusion 3D handoff sidecar (the bridge attaches the body).");+                }+            }+            println!("NEXT: this .lbr imports directly into Fusion 360 / Altium / OrCAD. For KiCad: `adom-lbr import {} -o part.kicad_sym`.", out_path.display());+             // 3D model: emit a sidecar manifest for the Fusion bridge. A valid             // Fusion 3D reference needs an Autodesk cloud URN, which only Fusion             // can mint — so the .lbr stays 2D and the bridge does the upload +