@hybridlabor-api/bdb-hardware-pcb 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/README.md +116 -0
  2. package/config/mcp/antigravity.json +22 -0
  3. package/config/mcp/claude.json +22 -0
  4. package/config/mcp/codex.toml +25 -0
  5. package/docs/adr/ADR-001-KICAD-OPENSCAD-MCP-STRATEGY.md +334 -0
  6. package/docs/review_documentation.md +121 -0
  7. package/installer.js +358 -0
  8. package/mcp_servers/kicad-mcp-server/.env.example +22 -0
  9. package/mcp_servers/kicad-mcp-server/.github/workflows/ci.yml +36 -0
  10. package/mcp_servers/kicad-mcp-server/CLAUDE.md +487 -0
  11. package/mcp_servers/kicad-mcp-server/README.md +316 -0
  12. package/mcp_servers/kicad-mcp-server/docs/DEVICE_TREE.md +416 -0
  13. package/mcp_servers/kicad-mcp-server/docs/INSTALLATION.md +332 -0
  14. package/mcp_servers/kicad-mcp-server/docs/PIN_ANALYSIS.md +332 -0
  15. package/mcp_servers/kicad-mcp-server/docs/README.md +240 -0
  16. package/mcp_servers/kicad-mcp-server/docs/TESTING.md +613 -0
  17. package/mcp_servers/kicad-mcp-server/docs/VALIDATION.md +268 -0
  18. package/mcp_servers/kicad-mcp-server/pyproject.toml +96 -0
  19. package/mcp_servers/kicad-mcp-server/requirements-dev.txt +16 -0
  20. package/mcp_servers/kicad-mcp-server/requirements-test.txt +24 -0
  21. package/mcp_servers/kicad-mcp-server/requirements.txt +13 -0
  22. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__init__.py +3 -0
  23. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__main__.py +17 -0
  24. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/config.py +46 -0
  25. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/__init__.py +1 -0
  26. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/types.py +87 -0
  27. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/__init__.py +1 -0
  28. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/netlist_parser.py +234 -0
  29. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser.py +375 -0
  30. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser_kicad.py +327 -0
  31. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/schematic_parser.py +902 -0
  32. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/server.py +71 -0
  33. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/__init__.py +1 -0
  34. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/arduino/connectivity_test.cpp.j2 +189 -0
  35. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/atmega.dts.j2 +77 -0
  36. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/esp32.dts.j2 +77 -0
  37. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/nrf52.dts.j2 +77 -0
  38. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/stm32f4.dts.j2 +89 -0
  39. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/esp_idf/test_suite.c.j2 +340 -0
  40. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/pytest/test_connectivity.py.j2 +147 -0
  41. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/st_hal/hal_test.c.j2 +313 -0
  42. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_gpio_test.py.j2 +99 -0
  43. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_i2c_test.py.j2 +117 -0
  44. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_pinmux_test.py.j2 +43 -0
  45. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_spi_test.py.j2 +94 -0
  46. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_gpio_test.c.j2 +113 -0
  47. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_i2c_test.c.j2 +101 -0
  48. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_spi_test.c.j2 +94 -0
  49. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/unittest/test_schematic.py.j2 +172 -0
  50. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/__init__.py +36 -0
  51. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/device_tree.py +1187 -0
  52. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/hierarchical_analysis.py +211 -0
  53. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/netlist.py +320 -0
  54. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/parts_registry.py +142 -0
  55. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb.py +955 -0
  56. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb_layout.py +308 -0
  57. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pin_analysis.py +765 -0
  58. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/project.py +196 -0
  59. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic.py +319 -0
  60. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_editor.py +674 -0
  61. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_search.py +158 -0
  62. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/validation.py +866 -0
  63. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/visualization.py +225 -0
  64. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/__init__.py +1 -0
  65. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/file_handlers.py +65 -0
  66. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_cli.py +103 -0
  67. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_version.py +103 -0
  68. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/parts_registry.py +197 -0
  69. package/mcp_servers/kicad-mcp-server/tests/__init__.py +1 -0
  70. package/mcp_servers/kicad-mcp-server/tests/examples/ESP32S3_TEST.md +219 -0
  71. package/mcp_servers/kicad-mcp-server/tests/fixtures/README.md +65 -0
  72. package/mcp_servers/kicad-mcp-server/tests/fixtures/__init__.py +1 -0
  73. package/mcp_servers/kicad-mcp-server/tests/fixtures/example_pcb.kicad_pcb +177 -0
  74. package/mcp_servers/kicad-mcp-server/tests/fixtures/example_schematic.kicad_sch +145 -0
  75. package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/child.kicad_sch +24 -0
  76. package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/root.kicad_sch +38 -0
  77. package/mcp_servers/kicad-mcp-server/tests/test_tools/__init__.py +1 -0
  78. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_hierarchical_labels.py +195 -0
  79. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_kicad_cli.py +116 -0
  80. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_netlist_cache_path.py +29 -0
  81. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic.py +189 -0
  82. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic_hierarchy.py +69 -0
  83. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_visualization.py +136 -0
  84. package/mcp_servers/kicad-mcp-server/uv.lock +2873 -0
  85. package/mcp_servers/openscad-mcp-server/.dockerignore +9 -0
  86. package/mcp_servers/openscad-mcp-server/.github/workflows/test.yml +40 -0
  87. package/mcp_servers/openscad-mcp-server/Dockerfile +29 -0
  88. package/mcp_servers/openscad-mcp-server/LICENSE +21 -0
  89. package/mcp_servers/openscad-mcp-server/README.md +154 -0
  90. package/mcp_servers/openscad-mcp-server/docs/audit.md +56 -0
  91. package/mcp_servers/openscad-mcp-server/docs/docker.md +66 -0
  92. package/mcp_servers/openscad-mcp-server/docs/issue-followup.md +19 -0
  93. package/mcp_servers/openscad-mcp-server/docs/jetson.md +17 -0
  94. package/mcp_servers/openscad-mcp-server/glama.json +4 -0
  95. package/mcp_servers/openscad-mcp-server/legacy/README.md +15 -0
  96. package/mcp_servers/openscad-mcp-server/legacy/README.original.md +294 -0
  97. package/mcp_servers/openscad-mcp-server/legacy/implementation_plan.md +100 -0
  98. package/mcp_servers/openscad-mcp-server/legacy/old/download_sam2_checkpoint.py +115 -0
  99. package/mcp_servers/openscad-mcp-server/legacy/old/src/ai/sam_segmentation.py +209 -0
  100. package/mcp_servers/openscad-mcp-server/legacy/old/src/models/threestudio_generator.py +231 -0
  101. package/mcp_servers/openscad-mcp-server/legacy/old/src/workflow/image_to_model_pipeline.py +260 -0
  102. package/mcp_servers/openscad-mcp-server/legacy/old/test_sam2_segmentation.py +96 -0
  103. package/mcp_servers/openscad-mcp-server/legacy/requirements.txt +57 -0
  104. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/README.md +39 -0
  105. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/ai-driven-code-generation.md +122 -0
  106. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/export-formats.md +76 -0
  107. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/ai/ai_service.py.md +51 -0
  108. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/main.py.md +63 -0
  109. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/models/code_generator.py.md +63 -0
  110. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/nlp/parameter_extractor.py.md +63 -0
  111. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/ai/natural-language-processing.md +78 -0
  112. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/nlp/parameter-extraction.md +173 -0
  113. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/export-formats.md +91 -0
  114. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/openscad-basics.md +66 -0
  115. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/primitive-testing.md +79 -0
  116. package/mcp_servers/openscad-mcp-server/legacy/src/__init__.py +0 -0
  117. package/mcp_servers/openscad-mcp-server/legacy/src/ai/ai_service.py +257 -0
  118. package/mcp_servers/openscad-mcp-server/legacy/src/ai/gemini_api.py +161 -0
  119. package/mcp_servers/openscad-mcp-server/legacy/src/ai/venice_api.py +203 -0
  120. package/mcp_servers/openscad-mcp-server/legacy/src/config.py +121 -0
  121. package/mcp_servers/openscad-mcp-server/legacy/src/main.py +1456 -0
  122. package/mcp_servers/openscad-mcp-server/legacy/src/main.py.new +404 -0
  123. package/mcp_servers/openscad-mcp-server/legacy/src/main_remote.py +401 -0
  124. package/mcp_servers/openscad-mcp-server/legacy/src/models/__init__.py +0 -0
  125. package/mcp_servers/openscad-mcp-server/legacy/src/models/code_generator.py +321 -0
  126. package/mcp_servers/openscad-mcp-server/legacy/src/models/cuda_mvs.py +209 -0
  127. package/mcp_servers/openscad-mcp-server/legacy/src/models/scad_templates/basic_shapes.scad +144 -0
  128. package/mcp_servers/openscad-mcp-server/legacy/src/nlp/__init__.py +0 -0
  129. package/mcp_servers/openscad-mcp-server/legacy/src/nlp/parameter_extractor.py +388 -0
  130. package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/__init__.py +0 -0
  131. package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/wrapper.py +418 -0
  132. package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/__init__.py +1 -0
  133. package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/printer_discovery.py +471 -0
  134. package/mcp_servers/openscad-mcp-server/legacy/src/remote/connection_manager.py +537 -0
  135. package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_client.py +435 -0
  136. package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_server.py +787 -0
  137. package/mcp_servers/openscad-mcp-server/legacy/src/remote/error_handling.py +415 -0
  138. package/mcp_servers/openscad-mcp-server/legacy/src/testing/__init__.py +0 -0
  139. package/mcp_servers/openscad-mcp-server/legacy/src/testing/primitive_tester.py +203 -0
  140. package/mcp_servers/openscad-mcp-server/legacy/src/testing/test_primitives.py +98 -0
  141. package/mcp_servers/openscad-mcp-server/legacy/src/utils/__init__.py +1 -0
  142. package/mcp_servers/openscad-mcp-server/legacy/src/utils/cad_exporter.py +241 -0
  143. package/mcp_servers/openscad-mcp-server/legacy/src/utils/format_validator.py +206 -0
  144. package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_exporter.py +140 -0
  145. package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_repair.py +91 -0
  146. package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_validator.py +123 -0
  147. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/__init__.py +0 -0
  148. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/headless_renderer.py +52 -0
  149. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/renderer.py +177 -0
  150. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/web_interface.py +639 -0
  151. package/mcp_servers/openscad-mcp-server/legacy/src/workflow/image_approval.py +148 -0
  152. package/mcp_servers/openscad-mcp-server/legacy/src/workflow/multi_view_to_model_pipeline.py +338 -0
  153. package/mcp_servers/openscad-mcp-server/legacy/test_complete_workflow.py +374 -0
  154. package/mcp_servers/openscad-mcp-server/legacy/test_cuda_mvs.py +191 -0
  155. package/mcp_servers/openscad-mcp-server/legacy/test_gemini_api.py +168 -0
  156. package/mcp_servers/openscad-mcp-server/legacy/test_image_approval.py +192 -0
  157. package/mcp_servers/openscad-mcp-server/legacy/test_image_approval_workflow.py +251 -0
  158. package/mcp_servers/openscad-mcp-server/legacy/test_image_to_model_pipeline.py +145 -0
  159. package/mcp_servers/openscad-mcp-server/legacy/test_model_selection.py +41 -0
  160. package/mcp_servers/openscad-mcp-server/legacy/test_multi_view_pipeline.py +290 -0
  161. package/mcp_servers/openscad-mcp-server/legacy/test_primitives.sh +13 -0
  162. package/mcp_servers/openscad-mcp-server/legacy/test_rabbit_direct.py +71 -0
  163. package/mcp_servers/openscad-mcp-server/legacy/test_remote_cuda_mvs.py +283 -0
  164. package/mcp_servers/openscad-mcp-server/legacy/test_venice_example.py +69 -0
  165. package/mcp_servers/openscad-mcp-server/pyproject.toml +33 -0
  166. package/mcp_servers/openscad-mcp-server/requirements.txt +2 -0
  167. package/mcp_servers/openscad-mcp-server/scad/simple_cube.scad +2 -0
  168. package/mcp_servers/openscad-mcp-server/scripts/test_docker.py +220 -0
  169. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__init__.py +3 -0
  170. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__main__.py +3 -0
  171. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/engine.py +94 -0
  172. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/geometry.py +242 -0
  173. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/server.py +245 -0
  174. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/service.py +190 -0
  175. package/mcp_servers/openscad-mcp-server/tests/conftest.py +17 -0
  176. package/mcp_servers/openscad-mcp-server/tests/test_engine.py +37 -0
  177. package/mcp_servers/openscad-mcp-server/tests/test_geometry.py +106 -0
  178. package/mcp_servers/openscad-mcp-server/tests/test_integration.py +172 -0
  179. package/mcp_servers/openscad-mcp-server/tests/test_transports.py +314 -0
  180. package/mcp_servers/openscad-mcp-server/uv.lock +1123 -0
  181. package/package.json +44 -0
  182. package/scripts/install_mcps.sh +86 -0
  183. package/scripts/openscad_wrapper.sh +62 -0
  184. package/scripts/run_kicad_mcp.sh +25 -0
  185. package/scripts/run_openscad_mcp.sh +41 -0
  186. package/scripts/test_mcp_connection.py +626 -0
  187. package/scripts/test_mcp_connection.sh +168 -0
  188. package/skills/code-first-hardware-design/SKILL.md +260 -0
  189. package/skills/pcb-constraint-definition/SKILL.md +236 -0
  190. package/skills/pcb-layout-routing-automation/SKILL.md +153 -0
  191. package/skills/pcb-validation-dfm-signoff/SKILL.md +194 -0
  192. package/skills/schematic-datasheet-analysis/SKILL.md +202 -0
@@ -0,0 +1,613 @@
1
+ # Testing Guide for KiCad MCP Server
2
+
3
+ This guide will help you test all the newly implemented features of the KiCad MCP Server.
4
+
5
+ ## Test Preparation
6
+
7
+ ### 1. Install Dependencies
8
+
9
+ ```bash
10
+ # Navigate to project directory
11
+ cd kicad-mcp-server
12
+
13
+ # Install core dependencies
14
+ pip install -r requirements.txt
15
+
16
+ # Install development dependencies
17
+ pip install -r requirements-dev.txt
18
+
19
+ # (Optional) Install hardware testing dependencies
20
+ pip install -r requirements-test.txt
21
+ ```
22
+
23
+ ### 2. Verify Installation
24
+
25
+ ```bash
26
+ # Check Python version (requires 3.10+)
27
+ python --version
28
+
29
+ # Verify KiCad installation
30
+ kicad-cli --version
31
+
32
+ # Test Python environment imports
33
+ python -c "
34
+ from kicad_mcp_server.tools import validation, pin_analysis, device_tree, test_generation
35
+ print('OK All modules imported successfully')
36
+ "
37
+ ```
38
+
39
+ ### 3. Prepare Test Files
40
+
41
+ If you don't have existing KiCad files, you can use sample files from the project or create simple test files:
42
+
43
+ ```bash
44
+ # Create test directory
45
+ mkdir -p test_files
46
+
47
+ # Check for sample files
48
+ ls -la examples/
49
+ ```
50
+
51
+ ## Basic Functionality Testing
52
+
53
+ ### Test 1: Verify Module Imports
54
+
55
+ ```python
56
+ # test_imports.py
57
+ def test_module_imports():
58
+ """Test that all new modules can be imported correctly"""
59
+ try:
60
+ from kicad_mcp_server.tools import validation
61
+ from kicad_mcp_server.tools import pin_analysis
62
+ from kicad_mcp_server.tools import device_tree
63
+ from kicad_mcp_server.tools import test_generation
64
+ print("OK All modules imported successfully")
65
+ return True
66
+ except ImportError as e:
67
+ print(f"X Module import failed: {e}")
68
+ return False
69
+
70
+ if __name__ == "__main__":
71
+ test_module_imports()
72
+ ```
73
+
74
+ Run test:
75
+ ```bash
76
+ python test_imports.py
77
+ ```
78
+
79
+ ### Test 2: Verify Tool Registration
80
+
81
+ ```python
82
+ # test_tools_registration.py
83
+ def test_tools_registration():
84
+ """Test that all MCP tools are correctly registered"""
85
+ from kicad_mcp_server.server import mcp
86
+
87
+ # Get all registered tools
88
+ tools = list(mcp._tools.values())
89
+
90
+ print(f"Total registered tools: {len(tools)}")
91
+
92
+ # Check new feature tools
93
+ expected_tools = [
94
+ 'run_erc', 'run_drc', # Validation tools
95
+ 'analyze_pin_functions', 'detect_pin_conflicts', # Pin analysis
96
+ 'generate_device_tree', # Device tree
97
+ 'generate_hardware_tests' # Test generation
98
+ ]
99
+
100
+ tool_names = [tool.name for tool in tools]
101
+ missing_tools = []
102
+
103
+ for expected in expected_tools:
104
+ if expected in tool_names:
105
+ print(f"OK {expected} registered")
106
+ else:
107
+ print(f"X {expected} not found")
108
+ missing_tools.append(expected)
109
+
110
+ if not missing_tools:
111
+ print("OK All expected tools registered!")
112
+ return True
113
+ else:
114
+ print(f"WARN Missing tools: {missing_tools}")
115
+ return False
116
+
117
+ if __name__ == "__main__":
118
+ test_tools_registration()
119
+ ```
120
+
121
+ Run test:
122
+ ```bash
123
+ python test_tools_registration.py
124
+ ```
125
+
126
+ ## Functional Testing (Requires KiCad Files)
127
+
128
+ ### Test 3: Design Rule Checking (DRC/ERC)
129
+
130
+ Create test script `test_validation.py`:
131
+
132
+ ```python
133
+ import asyncio
134
+ from kicad_mcp_server.tools import validation
135
+
136
+ async def test_erc_functionality():
137
+ """Test ERC functionality"""
138
+ # Replace with your schematic file path
139
+ schematic_path = "path/to/your/schematic.kicad_sch"
140
+
141
+ try:
142
+ result = await validation.run_erc(schematic_path)
143
+ print("ERC test results:")
144
+ print(result[:500] + "..." if len(result) > 500 else result)
145
+ return True
146
+ except Exception as e:
147
+ print(f"ERC test failed: {e}")
148
+ return False
149
+
150
+ async def test_drc_functionality():
151
+ """Test DRC functionality"""
152
+ pcb_path = "path/to/your/pcb.kicad_pcb"
153
+
154
+ try:
155
+ result = await validation.run_drc(pcb_path)
156
+ print("DRC test results:")
157
+ print(result[:500] + "..." if len(result) > 500 else result)
158
+ return True
159
+ except Exception as e:
160
+ print(f"DRC test failed: {e}")
161
+ return False
162
+
163
+ if __name__ == "__main__":
164
+ asyncio.run(test_erc_functionality())
165
+ asyncio.run(test_drc_functionality())
166
+ ```
167
+
168
+ ### Test 4: Pin Function Analysis
169
+
170
+ Create test script `test_pin_analysis.py`:
171
+
172
+ ```python
173
+ import asyncio
174
+ from kicad_mcp_server.tools import pin_analysis
175
+
176
+ async def test_pin_analysis():
177
+ """Test pin analysis functionality"""
178
+ schematic_path = "path/to/your/schematic.kicad_sch"
179
+
180
+ try:
181
+ # Analyze pin functions
182
+ result = await pin_analysis.analyze_pin_functions(schematic_path)
183
+ print("Pin function analysis:")
184
+ print(result[:500] + "..." if len(result) > 500 else result)
185
+
186
+ # Detect pin conflicts
187
+ conflicts = await pin_analysis.detect_pin_conflicts(schematic_path)
188
+ print("\nPin conflict detection:")
189
+ print(conflicts[:500] + "..." if len(conflicts) > 500 else conflicts)
190
+
191
+ return True
192
+ except Exception as e:
193
+ print(f"Pin analysis test failed: {e}")
194
+ return False
195
+
196
+ if __name__ == "__main__":
197
+ asyncio.run(test_pin_analysis())
198
+ ```
199
+
200
+ ### Test 5: Device Tree Generation
201
+
202
+ Create test script `test_device_tree.py`:
203
+
204
+ ```python
205
+ import asyncio
206
+ from kicad_mcp_server.tools import device_tree
207
+
208
+ async def test_device_tree_generation():
209
+ """Test device tree generation functionality"""
210
+ schematic_path = "path/to/your/schematic.kicad_sch"
211
+
212
+ try:
213
+ # Validate pin configuration
214
+ validation = await device_tree.validate_pin_configuration(schematic_path)
215
+ print("Pin configuration validation:")
216
+ print(validation[:500] + "..." if len(validation) > 500 else validation)
217
+
218
+ # Generate device tree
219
+ if "OK" in validation:
220
+ result = await device_tree.generate_device_tree(
221
+ schematic_path=schematic_path,
222
+ target_soc="stm32f4",
223
+ output_path="test_output.dts"
224
+ )
225
+ print("\nDevice tree generation:")
226
+ print(result[:500] + "..." if len(result) > 500 else result)
227
+ return True
228
+ else:
229
+ print("WARN Design validation failed, skipping device tree generation")
230
+ return False
231
+
232
+ except Exception as e:
233
+ print(f"Device tree generation test failed: {e}")
234
+ return False
235
+
236
+ if __name__ == "__main__":
237
+ asyncio.run(test_device_tree_generation())
238
+ ```
239
+
240
+ ### Test 6: Test Code Generation
241
+
242
+ Create test script `test_test_generation.py`:
243
+
244
+ ```python
245
+ import asyncio
246
+ from kicad_mcp_server.tools import test_generation
247
+
248
+ async def test_test_generation():
249
+ """Test code generation functionality"""
250
+ schematic_path = "path/to/your/schematic.kicad_sch"
251
+
252
+ try:
253
+ # Generate hardware test suite
254
+ result = await test_generation.generate_hardware_tests(
255
+ schematic_path=schematic_path,
256
+ framework="pytest",
257
+ output_dir="test_output/"
258
+ )
259
+ print("Hardware test generation:")
260
+ print(result[:500] + "..." if len(result) > 500 else result)
261
+
262
+ # Export test framework
263
+ framework = await test_generation.export_test_framework(
264
+ schematic_path=schematic_path,
265
+ framework="pytest",
266
+ output_dir="test_framework/"
267
+ )
268
+ print("\nTest framework export:")
269
+ print(framework[:500] + "..." if len(framework) > 500 else framework)
270
+
271
+ return True
272
+ except Exception as e:
273
+ print(f"Test generation failed: {e}")
274
+ return False
275
+
276
+ if __name__ == "__main__":
277
+ asyncio.run(test_test_generation())
278
+ ```
279
+
280
+ ## Complete Test Suite
281
+
282
+ Create comprehensive test script `test_complete_suite.py`:
283
+
284
+ ```python
285
+ #!/usr/bin/env python3
286
+ """
287
+ KiCad MCP Server Complete Test Suite
288
+ Tests all newly implemented features
289
+ """
290
+
291
+ import asyncio
292
+ import sys
293
+ from pathlib import Path
294
+
295
+ # Test configuration
296
+ TEST_SCHEMATIC = "path/to/your/schematic.kicad_sch" # Replace with actual path
297
+ TEST_PCB = "path/to/your/pcb.kicad_pcb" # Replace with actual path
298
+
299
+ class TestSuite:
300
+ def __init__(self):
301
+ self.results = {
302
+ "passed": 0,
303
+ "failed": 0,
304
+ "skipped": 0,
305
+ "tests": []
306
+ }
307
+
308
+ async def test_imports(self):
309
+ """Test 1: Module imports"""
310
+ print("Testing module imports...")
311
+ try:
312
+ from kicad_mcp_server.tools import validation
313
+ from kicad_mcp_server.tools import pin_analysis
314
+ from kicad_mcp_server.tools import device_tree
315
+ from kicad_mcp_server.tools import test_generation
316
+ self._record_result("Module imports", True)
317
+ return True
318
+ except Exception as e:
319
+ self._record_result("Module imports", False, str(e))
320
+ return False
321
+
322
+ async def test_validation_tools(self):
323
+ """Test 2: Validation tools"""
324
+ print("\nTesting validation tools...")
325
+ try:
326
+ from kicad_mcp_server.tools import validation
327
+
328
+ if not Path(TEST_SCHEMATIC).exists():
329
+ print("WARN Test schematic not found, skipping ERC test")
330
+ self._record_result("ERC tool", None, "Test file does not exist")
331
+ return False
332
+
333
+ result = await validation.run_erc(TEST_SCHEMATIC)
334
+ success = "run_erc" in result.lower()
335
+ self._record_result("ERC tool", success)
336
+ return success
337
+ except Exception as e:
338
+ self._record_result("Validation tools", False, str(e))
339
+ return False
340
+
341
+ async def test_pin_analysis(self):
342
+ """Test 3: Pin analysis"""
343
+ print("\nTesting pin analysis...")
344
+ try:
345
+ from kicad_mcp_server.tools import pin_analysis
346
+
347
+ if not Path(TEST_SCHEMATIC).exists():
348
+ print("WARN Test schematic not found, skipping pin analysis test")
349
+ self._record_result("Pin analysis", None, "Test file does not exist")
350
+ return False
351
+
352
+ result = await pin_analysis.analyze_pin_functions(TEST_SCHEMATIC)
353
+ success = "pin" in result.lower()
354
+ self._record_result("Pin function analysis", success)
355
+ return success
356
+ except Exception as e:
357
+ self._record_result("Pin analysis", False, str(e))
358
+ return False
359
+
360
+ async def test_device_tree(self):
361
+ """Test 4: Device tree generation"""
362
+ print("\nTesting device tree generation...")
363
+ try:
364
+ from kicad_mcp_server.tools import device_tree
365
+
366
+ if not Path(TEST_SCHEMATIC).exists():
367
+ print("WARN Test schematic not found, skipping device tree test")
368
+ self._record_result("Device tree generation", None, "Test file does not exist")
369
+ return False
370
+
371
+ result = await device_tree.validate_pin_configuration(TEST_SCHEMATIC)
372
+ success = "validation" in result.lower() or "OK" in result
373
+ self._record_result("Device tree validation", success)
374
+ return success
375
+ except Exception as e:
376
+ self._record_result("Device tree generation", False, str(e))
377
+ return False
378
+
379
+ async def test_test_generation(self):
380
+ """Test 5: Test code generation"""
381
+ print("\nTesting test code generation...")
382
+ try:
383
+ from kicad_mcp_server.tools import test_generation
384
+
385
+ if not Path(TEST_SCHEMATIC).exists():
386
+ print("WARN Test schematic not found, skipping test generation")
387
+ self._record_result("Test code generation", None, "Test file does not exist")
388
+ return False
389
+
390
+ result = await test_generation.generate_gpio_test(TEST_SCHEMATIC)
391
+ success = "gpio" in result.lower() or "test" in result.lower()
392
+ self._record_result("GPIO test generation", success)
393
+ return success
394
+ except Exception as e:
395
+ self._record_result("Test code generation", False, str(e))
396
+ return False
397
+
398
+ def _record_result(self, test_name, success, error=None):
399
+ """Record test result"""
400
+ status = "PASS" if success else ("SKIP" if success is None else "FAIL")
401
+ result = {
402
+ "name": test_name,
403
+ "status": status,
404
+ "error": error
405
+ }
406
+ self.results["tests"].append(result)
407
+
408
+ if status == "PASS":
409
+ self.results["passed"] += 1
410
+ print(f"OK {test_name}: Passed")
411
+ elif status == "SKIP":
412
+ self.results["skipped"] += 1
413
+ print(f"SKIP {test_name}: Skipped - {error}")
414
+ else:
415
+ self.results["failed"] += 1
416
+ print(f"X {test_name}: Failed - {error}")
417
+
418
+ def print_summary(self):
419
+ """Print test summary"""
420
+ print("\n" + "="*50)
421
+ print("Test Summary")
422
+ print("="*50)
423
+ print(f"Total: {self.results['passed'] + self.results['failed'] + self.results['skipped']} tests")
424
+ print(f"OK Passed: {self.results['passed']}")
425
+ print(f"X Failed: {self.results['failed']}")
426
+ print(f"SKIP Skipped: {self.results['skipped']}")
427
+
428
+ if self.results["failed"] == 0:
429
+ print("\nOK All tests passed!")
430
+ return 0
431
+ else:
432
+ print(f"\nWARN {self.results['failed']} test(s) failed")
433
+ return 1
434
+
435
+ async def run_all_tests():
436
+ """Run all tests"""
437
+ print("Starting KiCad MCP Server Test Suite")
438
+ print("="*50)
439
+
440
+ suite = TestSuite()
441
+
442
+ # Run all tests
443
+ await suite.test_imports()
444
+ await suite.test_validation_tools()
445
+ await suite.test_pin_analysis()
446
+ await suite.test_device_tree()
447
+ await suite.test_test_generation()
448
+
449
+ # Print summary
450
+ return suite.print_summary()
451
+
452
+ if __name__ == "__main__":
453
+ # Check test file paths
454
+ if not Path(TEST_SCHEMATIC).exists():
455
+ print(f"WARN Test schematic file does not exist: {TEST_SCHEMATIC}")
456
+ print("Please edit the TEST_SCHEMATIC variable in the script to point to a valid KiCad schematic file")
457
+ print("\nContinuing with basic module import tests...\n")
458
+
459
+ exit_code = asyncio.run(run_all_tests())
460
+ sys.exit(exit_code)
461
+ ```
462
+
463
+ Run complete test:
464
+ ```bash
465
+ python test_complete_suite.py
466
+ ```
467
+
468
+ ## Debugging Tests
469
+
470
+ If you encounter issues, use the debug script:
471
+
472
+ ```python
473
+ # debug_test.py
474
+ import sys
475
+ import traceback
476
+
477
+ def debug_import(module_name):
478
+ """Debug module imports"""
479
+ try:
480
+ module = __import__(module_name)
481
+ print(f"OK {module_name} imported successfully")
482
+ return True
483
+ except Exception as e:
484
+ print(f"X {module_name} import failed:")
485
+ print(f" Error: {e}")
486
+ traceback.print_exc()
487
+ return False
488
+
489
+ if __name__ == "__main__":
490
+ print("Debugging KiCad MCP Server Imports")
491
+ print("="*50)
492
+
493
+ modules = [
494
+ "kicad_mcp_server",
495
+ "kicad_mcp_server.tools.validation",
496
+ "kicad_mcp_server.tools.pin_analysis",
497
+ "kicad_mcp_server.tools.device_tree",
498
+ "kicad_mcp_server.tools.test_generation"
499
+ ]
500
+
501
+ results = []
502
+ for module in modules:
503
+ results.append(debug_import(module))
504
+
505
+ if all(results):
506
+ print("\nOK All modules imported successfully!")
507
+ else:
508
+ print(f"\nWARN {sum(not r for r in results)} module(s) failed to import")
509
+ sys.exit(1)
510
+ ```
511
+
512
+ ## Quick Verification Checklist
513
+
514
+ Use this quick checklist to verify all functionality:
515
+
516
+ ```bash
517
+ # 1. Verify Python environment
518
+ python --version # Should be >= 3.10
519
+
520
+ # 2. Verify dependency installation
521
+ pip list | grep -E "mcp|kicad|pydantic|jinja2"
522
+
523
+ # 3. Verify module imports
524
+ python -c "from kicad_mcp_server.tools import validation, pin_analysis, device_tree, test_generation; print('OK Import successful')"
525
+
526
+ # 4. Verify KiCad installation
527
+ kicad-cli --version
528
+
529
+ # 5. Run basic tests
530
+ python test_imports.py
531
+ python test_tools_registration.py
532
+
533
+ # 6. If test files exist, run complete test suite
534
+ python test_complete_suite.py
535
+ ```
536
+
537
+ ## Testing Recommendations
538
+
539
+ ### If you have KiCad files:
540
+
541
+ 1. **Start Small**: Test with simple schematics first
542
+ 2. **Incremental Testing**: Test each functional module incrementally
543
+ 3. **Verify Output**: Check generated code and reports
544
+
545
+ ### If you don't have KiCad files:
546
+
547
+ 1. **Basic Tests**: Run module import and tool registration tests
548
+ 2. **Template Tests**: Verify template files exist
549
+ 3. **Documentation Tests**: Check documentation completeness
550
+
551
+ ### Create Minimal Test Files:
552
+
553
+ ```python
554
+ # create_minimal_test.py
555
+ import asyncio
556
+ from kicad_mcp_server.tools import validation
557
+
558
+ async def minimal_test():
559
+ """Minimal functionality test"""
560
+ print("Running minimal functionality test...")
561
+
562
+ # Test ERC functionality (can test basic logic even if file doesn't exist)
563
+ try:
564
+ result = await validation.run_erc("nonexistent.kicad_sch")
565
+ if "X" in result and "not found" in result.lower():
566
+ print("OK ERC basic functionality normal (correctly handled non-existent file)")
567
+ return True
568
+ else:
569
+ print("WARN ERC response not as expected")
570
+ return False
571
+ except Exception as e:
572
+ print(f"X ERC test failed: {e}")
573
+ return False
574
+
575
+ if __name__ == "__main__":
576
+ success = asyncio.run(minimal_test())
577
+ print(f"\n{'OK Success' if success else 'X Failed'}")
578
+ ```
579
+
580
+ ## Expected Test Results
581
+
582
+ If successful, you should see:
583
+
584
+ ```
585
+ Starting KiCad MCP Server Test Suite
586
+ ==================================================
587
+ Testing module imports...
588
+ OK Module imports: Passed
589
+
590
+ Testing validation tools...
591
+ OK ERC tool: Passed
592
+
593
+ Testing pin analysis...
594
+ OK Pin function analysis: Passed
595
+
596
+ Testing device tree generation...
597
+ OK Device tree validation: Passed
598
+
599
+ Testing test code generation...
600
+ OK GPIO test generation: Passed
601
+
602
+ ==================================================
603
+ Test Summary
604
+ ==================================================
605
+ Total: 5 tests
606
+ OK Passed: 5
607
+ X Failed: 0
608
+ SKIP Skipped: 0
609
+
610
+ OK All tests passed!
611
+ ```
612
+
613
+ Start testing! If you encounter any issues, let me know the specific error messages.