Repository navigation
v0.9.0 — the truth-in-responses release
Konnect v0.9.0
Every change in this release is about the same thing: what the tool tells you is what the board or sheet actually holds. Two new tools, a day-one connectivity gap closed, multi-unit components handled whole, and a string of responses that now derive from results instead of echoing requests. Six of the nine merged changes came from outside contributors.
Update placed footprints from their libraries (#232, closes #231)
New tool update_footprints_from_library — the MCP equivalent of KiCad's Tools → Update Footprints from Library. It plans against the live board over IPC, resolves each footprint's library source on disk, and reports per-footprint changed domains (pads, graphics, models, metadata) with a preserved block derived by comparing the rebuilt instance against the board's — position, rotation, KIID, pad nets, and overrides each verified, not asserted. Dry-run by default; apply requires the exact returned plan_revision and lands as one KiCad undo commit. Refuses rather than guesses: unsupported library content, removed-but-connected pads, and stale revisions all conflict without mutating.
Live-verified end to end: a filtered refresh of four footprints applied, read back from the file KiCad saved (nets preserved by name, untouched footprints byte-identical), post-apply dry run converging to noop, and a DRC delta of exactly the intended library change. By @TWT233 — the plan-revision gate and mock-commit test design made this the most verifiable tool in the catalog.
Known limitation, measured and tracked as #331: library footprints carrying fp_text user fab text (most of the official libraries) currently refuse rather than risk dropping artwork — the honest choice until text support lands. Footprints without fab text, including everything Konnect authors, work today.
Batch component placement, atomically (#264)
New tool set_component_placements — set position and rotation for many existing footprints in one call. Over IPC it is one snapshot, one update, one KiCad undo step, all-or-nothing: a batch naming a missing or duplicated reference drops the whole commit and the board is untouched (verified live — "changes dropped", and the file showed it). With KiCad closed, one revision-checked file write with the same all-or-nothing property.
The response reports what the board holds after the commit, read back from KiCad — not what you asked for. The live run demonstrated why: a requested rotation of 270° came back as −90°, because that is what KiCad actually stored. By @nordic-style.
Junction dots survive moves (#330, closes #120)
Since the first release, moving a component neither added the junction dot a pin landing mid-wire needs, nor removed the dot a departing pin stranded — a stranded dot at a wire crossing silently shorts two nets. move_schematic_component and bulk_move_schematic_components now diff pin endpoints before and after and reconcile the dots, with the full rulebook: a real tee keeps its dot, a mere crossing never gains one (that would merge nets), no-connects forbid dots, and bus junctions are left to KiCad. Responses carry derived junctions_added_count / junctions_pruned_count. Fixture is a genuine eeschema save. By @triglav-modular.
Multi-unit components are handled whole (#273, part of #182)
A multi-unit part — a dual op-amp, a tube with its heater — is one component stored as several placed blocks, and every reference-addressed mutation now treats it that way: delete removes all units, move applies one rigid-body delta (relative layout preserved), rotate turns every unit with normalized angles, field edits and annotations land in every block, replace_component swaps every unit's lib_id atomically with per-unit validation, and move_region selects by UUID so grabbing unit 2 no longer moves unit 1. Verified end to end against a real three-unit component: one shared delta in the saved file, per unit. By @nordic-style; the eeschema-authored multi-unit fixture that pins the dialect handling is now in the tree for every future test to use.
Live pad readback tells the truth (#265)
get_component_pads on a live board now: errors on a malformed pad instead of silently dropping it, errors on a missing position instead of fabricating (0,0), refuses when a reachable KiCad rejects the request instead of silently falling back to the stale file, and reports each pad's layers. Behind it, the reverse layer map was widened to all 96 representable layers — a through-hole pad's stack used to render as 28 copies of "Unknown". Live and file paths verified to agree on positions and nets; each reports its source's own layer vocabulary (source tells you which). By @nordic-style.
Schematic layout reports real geometry (#275)
get_schematic_layout.bounding_box used to be a hull of component origins; check_schematic_overlaps compared anchors. Both now measure transformed symbol envelopes — rectangles, polylines, Bézier hulls, exact arc extrema, full pin segments, through rotation and both mirror modes — and name anything unresolvable in bounds_unresolved instead of silently falling back. Multi-unit aware: each placed unit gets bounds from its own unit's drawing, pinned against a real eeschema save. By @nordic-style.
add_bus_entry reports which end is which — from the sheet (#329)
The response labeled the entry's corners wire_side/bus_side from the documented convention without ever checking the sheet, so placing the entry's anchor on the bus — the natural call — got inverted labels, and following wire_side attached the wire to the bus itself, where it connects nothing. Both corners are now judged against the sheet's actual bus segments; when geometry cannot decide, the response says so in a note instead of silently asserting. Reported with a perfect repro by @triglav-modular.
Licensing clarity
COMMERCIAL.md now says plainly what the AGPL already meant: internal use is free, always — any number of machines, any commercial purpose, modified or not. Copyleft obligations begin where distribution or public network hosting begins, and MCP clients talking to Konnect are separate works. The commercial license is for shipping or hosting Konnect itself, or for organizations that prefer a signed agreement, support, or indemnity.
Response and schema changes (minor-release rule)
New tools: update_footprints_from_library, set_component_placements (204 → 206 registered, 210 → 212 total). Response additions: get_component_pads pads gain layers; move/rotate/delete/edit/get on schematic components gain multi-unit fields (moved_units, rotated_units, deleted_units, units_replaced, unit_count, units[], placements[]); move tools gain junctions_added_count/junctions_pruned_count; add_bus_entry gains an optional note. Semantics changes: get_schematic_layout.bounding_box and check_schematic_overlaps now measure real symbol envelopes (values change on every schematic — the old numbers were origin hulls); add_bus_entry.bus_side/wire_side are now geometry-derived; rotation values in responses are normalized to what KiCad stores.
Known limitations
update_footprints_from_libraryrefuses library footprints withfp_text userfab text (#331) — most official-library parts, until text support lands.move_connectedstill refuses by design; #330 closed the junction half of #120, but the wire-carrying move remains open.- The shared connectivity index is bus-blind (#328) — bus points are deliberately outside the junction reconciler's jurisdiction.
- The
moving_and_rotating_footprint_preserves_child_geometrylive test remains ~1-in-3 flaky (#221).
Counts: 19 toolsets, 206 registered tools / 212 total.
What's Changed
- feat(pcb): update placed footprints from libraries by @TWT233 in #232
- fix(pcb): harden live footprint pad readback by @nordic-style in #265
- fix(schematic): update every placed component unit by @nordic-style in #273
- fix(sch): re-judge junction dots after a move by @triglav-modular in #330
- feat(pcb): batch component placement atomically by @nordic-style in #264
- chore(deps): bump actions/setup-python from 5 to 7 by @dependabot[bot] in #243
- chore(deps): bump uuid from 1.24.0 to 1.24.1 in the minor-and-patch group by @dependabot[bot] in #321
- chore(deps): bump uuid from 1.24.0 to 1.24.1 in /crates/schematic-viewer in the minor-and-patch group by @dependabot[bot] in #320
- fix(schematic): measure placed symbol geometry by @nordic-style in #275
Full Changelog: v0.8.0...v0.9.0