app
KiCad - the KiCad Bridge
Public Made by Adomby adom
Drive your own KiCad from an AI, in the background: open every editor, read the whole board as data (the EDA Bridge Standard board model), stack-up, part heights, netlists, place, route, pour, DRC and exports.
← Commit history
1.0.49: 1.0.49: kicad_open_footprint_editor no longer blames a stock library for a failed load. The 1.0.37 diagnosis (wiki #111) said library_not_loaded_by_running_kicad for any library found on disk, including Resistor_SMD, which every KiCad loads at start through its nested template table. It now says that only for a row in the user's own fp-lib-table, the only kind that can be added after KiCad starts; everything else stays navigation_failed.
3 files changed
+16−4
rust/Cargo.lock+3−3@@ -244,7 +244,7 @@ dependencies = [ [[package]] name = "kicad-bridge"-version = "1.0.48"+version = "1.0.49" dependencies = [ "kicad-core", "kicad-platform",@@ -255,7 +255,7 @@ dependencies = [ [[package]] name = "kicad-core"-version = "1.0.48"+version = "1.0.49" dependencies = [ "kicad-ipc-rs", "kicad-platform",@@ -281,7 +281,7 @@ dependencies = [ [[package]] name = "kicad-platform"-version = "1.0.48"+version = "1.0.49" dependencies = [ "serde", "serde_json",
rust/Cargo.toml+1−1@@ -3,7 +3,7 @@ resolver = "2" members = ["crates/*"] [workspace.package]-version = "1.0.48"+version = "1.0.49" edition = "2021" license = "MIT" publish = false
rust/crates/kicad-bridge/src/verbs_windows.rs+12@@ -517,6 +517,13 @@ fn spawn_background(exe: &Path, args: &[String], tag: &str, trace_masks: Option< Ok((pid, log)) } +/// Is `name` a row of the user's own fp-lib-table (not only reachable through a nested table)?+fn user_table_row(ctx: &LibCtx, name: &str) -> bool {+ ctx.fp_lib_table()+ .and_then(|p| kicad_core::libraries::LibTable::parse_file(&p).ok())+ .is_some_and(|t| t.entries.iter().any(|e| e.name == name && !e.lib_type.eq_ignore_ascii_case("Table")))+}+ /// Before a KiCad process starts, and only while none runs: mark KiCad's setup wizard as done so /// it never pops up in front of the user (see kicad_common::mark_first_run_done). fn skip_setup_wizard() {@@ -2064,6 +2071,11 @@ pub(crate) fn open_footprint_editor(state: &mut State, args: &Value) -> Value { v["availableFootprints"] = json!(info.footprints.iter().take(40).collect::<Vec<_>>()); v["_hint"] = json!("Pick a name from availableFootprints (kicad_list_footprints {library} has the full list)."); }+ // Only a row in the user's OWN table can have been added after KiCad started. A stock+ // library (reached through KiCad's nested template table) is loaded by every KiCad at+ // start, so for those the failure is the navigation itself: keep navigation_failed+ // (1.0.37 blamed Resistor_SMD on "registered after launch", AdomLapper 2026-09-21).+ Some(_) if !user_table_row(&ctx, &library_name) => {} Some((_, info)) => { v["errorCode"] = json!("library_not_loaded_by_running_kicad"); v["libraryOnDisk"] = json!(info.path);