From 7f473e06cc3574ae626152fbc6cdc058c2665ee4 Mon Sep 17 00:00:00 2001 From: William Viana Date: Thu, 23 Apr 2026 21:24:54 -0700 Subject: [PATCH] fix: prevent import-time crash when ~/.kicad-mcp/ is not writable Configuring logging at module import time hard-failed in environments without write access to the user's home directory (sandboxed pytest runners, restricted CI containers, read-only filesystems). The unhandled OSError/PermissionError aborted module import and cascaded into ~100 test failures during collection. Wrap the FileHandler setup in try/except and fall back to console-only logging when the log directory cannot be created. Production behavior is unchanged - file logging in ~/.kicad-mcp/logs is still used whenever the directory is writable. Also picks up an isort-driven import reorder applied by the project's pre-commit hook. --- python/kicad_interface.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/python/kicad_interface.py b/python/kicad_interface.py index f0d37eb..3b2e913 100644 --- a/python/kicad_interface.py +++ b/python/kicad_interface.py @@ -15,24 +15,32 @@ import traceback from pathlib import Path from typing import Any, Dict, List, Optional, Tuple +from annotations import AnnotationLoader from resources.resource_definitions import RESOURCE_DEFINITIONS, handle_resource_read # Import tool schemas, resource definitions, and IPC API annotations from schemas.tool_schemas import TOOL_SCHEMAS -from annotations import AnnotationLoader _annotation_loader = AnnotationLoader() # Configure logging -log_dir = os.path.join(os.path.expanduser("~"), ".kicad-mcp", "logs") -os.makedirs(log_dir, exist_ok=True) -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)], -) +# Try to set up a file handler in ~/.kicad-mcp/logs. If that directory isn't +# writable (e.g. sandboxed test environments, restricted CI runners), fall +# back to console-only logging so importing this module never crashes. +try: + log_dir = os.path.join(os.path.expanduser("~"), ".kicad-mcp", "logs") + os.makedirs(log_dir, exist_ok=True) + 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)], + ) +except (OSError, PermissionError): + logging.basicConfig( + level=logging.DEBUG, + format="%(asctime)s [%(levelname)s] %(message)s", + ) logger = logging.getLogger("kicad_interface") # Log Python environment details