fix: prevent header corruption when sexpdata compacts schematic to single line

create_component_instance used line-based insertion which placed new
symbols BEFORE (kicad_sch ...) header when the file was written as
a single line by sexpdata.dumps(). Switch to rfind()-based string
insertion which is format-independent.

Also remove StreamHandler(sys.stdout) from logging — Python logs now
go only to file (~/.kicad-mcp/logs/kicad_interface.log) to avoid
polluting MCP stderr with INFO/DEBUG entries shown as [error].
This commit is contained in:
Tom
2026-03-06 13:17:25 +01:00
parent e7a8234ec4
commit 93ae23dacc
2 changed files with 8 additions and 20 deletions

View File

@@ -450,29 +450,17 @@ class DynamicSymbolLoader:
with open(schematic_path, "r", encoding="utf-8") as f:
content = f.read()
# Insert before (sheet_instances or at end before final )
lines = content.split("\n")
insert_pos = None
for i, line in enumerate(lines):
if "(sheet_instances" in line:
insert_pos = i
break
if insert_pos is None:
# Insert before the last closing parenthesis
for i in range(len(lines) - 1, -1, -1):
if lines[i].strip() == ")":
insert_pos = i
break
if insert_pos is None:
# Insert before (sheet_instances using direct string search.
# This works for both pretty-printed and sexpdata-compacted single-line files.
insert_marker = "(sheet_instances"
insert_at = content.rfind(insert_marker)
if insert_at == -1:
raise ValueError("Could not find insertion point in schematic")
lines.insert(insert_pos, instance_block)
content = content[:insert_at] + instance_block + "\n " + content[insert_at:]
with open(schematic_path, "w", encoding="utf-8") as f:
f.write("\n".join(lines))
f.write(content)
logger.info(
f"Added component instance {reference} ({full_lib_id}) at ({x}, {y})"

View File

@@ -26,7 +26,7 @@ log_file = os.path.join(log_dir, "kicad_interface.log")
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[logging.FileHandler(log_file), logging.StreamHandler(sys.stdout)],
handlers=[logging.FileHandler(log_file)],
)
logger = logging.getLogger("kicad_interface")