fix: Address critical Windows compatibility and JLCPCB issues (#36, #37, #35)

Phase 1 critical fixes addressing three high-priority issues:

Issue #36 - Windows IPC backend crash (os.getuid not available):
- Add platform detection to skip Unix-specific socket paths on Windows
- Use hasattr check before calling os.getuid()
- Windows now uses auto-detect fallback (named pipes)
- Maintains full Unix socket support on Linux/macOS

Issue #37 - Windows schematic file creation broken:
- Generate unique UUIDs instead of invalid all-zeros UUID
- Add explicit UTF-8 encoding for cross-platform compatibility
- Force Unix line endings (LF) to prevent Windows CRLF issues
- Update template file with valid placeholder UUID
- Fix hardcoded /tmp/ paths in wire_manager.py and pin_locator.py

Issue #35 - JLCPCB download limited to 100 parts:
- Change batch_size from 1000 to 100 to match tscircuit API limit
- Remove premature loop termination when batch < batch_size
- Add documentation explaining API limitation
- Expected result: Full ~2.5M part catalog download (40-60 minutes)

All changes maintain backward compatibility and include detailed comments.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
KiCAD MCP Bot
2026-02-26 10:03:20 -05:00
parent b9bd401b11
commit b4d114ac74
6 changed files with 33 additions and 19 deletions

View File

@@ -143,14 +143,17 @@ class JLCSearchClient:
def download_all_components(
self,
callback: Optional[Callable[[int, str], None]] = None,
batch_size: int = 1000
batch_size: int = 100
) -> List[Dict]:
"""
Download all components from jlcsearch database
Note: tscircuit API has a hard-coded 100 result limit per request.
Full catalog download requires ~25,000 paginated requests (~40-60 minutes).
Args:
callback: Optional progress callback function(parts_count, status_msg)
batch_size: Number of parts per batch
batch_size: Number of parts per batch (max 100 due to API limit)
Returns:
List of all parts
@@ -168,7 +171,8 @@ class JLCSearchClient:
offset=offset
)
if not batch:
# Stop if no results returned (end of catalog)
if not batch or len(batch) == 0:
break
all_parts.extend(batch)
@@ -179,9 +183,8 @@ class JLCSearchClient:
else:
logger.info(f"Downloaded {len(all_parts)} parts so far...")
# If we got fewer results than requested, we've reached the end
if len(batch) < batch_size:
break
# Continue pagination - API returns exactly 100 results per page until exhausted
# Only stop when we get 0 results (handled above)
# Rate limiting - be nice to the API
time.sleep(0.1)