@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,96 @@
1
+ import os
2
+ import sys
3
+ import logging
4
+ import argparse
5
+ from pathlib import Path
6
+ from typing import Dict, Any, List, Optional, Tuple
7
+
8
+ # Configure logging
9
+ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
10
+ logger = logging.getLogger(__name__)
11
+
12
+ # Add project root to path
13
+ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
14
+
15
+ # Import SAM2 segmenter and config
16
+ from src.ai.sam_segmentation import SAMSegmenter
17
+ from src.config import SAM2_CHECKPOINT_PATH, SAM2_MODEL_TYPE, SAM2_USE_GPU, MASKS_DIR
18
+
19
+ def test_sam2_segmentation(image_path: str, output_dir: Optional[str] = None, use_auto_points: bool = True):
20
+ """
21
+ Test SAM2 segmentation on an image.
22
+
23
+ Args:
24
+ image_path: Path to the input image
25
+ output_dir: Directory to save segmentation results (default: config.MASKS_DIR)
26
+ use_auto_points: Whether to use automatic point generation
27
+ """
28
+ # Validate image path
29
+ if not os.path.exists(image_path):
30
+ logger.error(f"Image not found: {image_path}")
31
+ return
32
+
33
+ # Use default output directory if not provided
34
+ if not output_dir:
35
+ output_dir = os.path.join(MASKS_DIR, Path(image_path).stem)
36
+
37
+ # Create output directory
38
+ os.makedirs(output_dir, exist_ok=True)
39
+
40
+ logger.info(f"Testing SAM2 segmentation on image: {image_path}")
41
+ logger.info(f"Model type: {SAM2_MODEL_TYPE}")
42
+ logger.info(f"Checkpoint path: {SAM2_CHECKPOINT_PATH}")
43
+ logger.info(f"Using GPU: {SAM2_USE_GPU}")
44
+
45
+ try:
46
+ # Initialize SAM2 segmenter
47
+ logger.info("Initializing SAM2 segmenter...")
48
+ sam_segmenter = SAMSegmenter(
49
+ model_type=SAM2_MODEL_TYPE,
50
+ checkpoint_path=SAM2_CHECKPOINT_PATH,
51
+ use_gpu=SAM2_USE_GPU,
52
+ output_dir=output_dir
53
+ )
54
+
55
+ # Perform segmentation
56
+ if use_auto_points:
57
+ logger.info("Using automatic point generation")
58
+ result = sam_segmenter.segment_with_auto_points(image_path)
59
+ else:
60
+ # Use center point of the image for manual point
61
+ logger.info("Using manual center point")
62
+ import cv2
63
+ image = cv2.imread(image_path)
64
+ h, w = image.shape[:2]
65
+ center_point = (w // 2, h // 2)
66
+ result = sam_segmenter.segment_image(image_path, points=[center_point])
67
+
68
+ # Print results
69
+ logger.info(f"Segmentation completed with {result.get('num_masks', 0)} masks")
70
+
71
+ if result.get('mask_paths'):
72
+ logger.info(f"Mask paths: {result.get('mask_paths')}")
73
+
74
+ return result
75
+
76
+ except Exception as e:
77
+ logger.error(f"Error in SAM2 segmentation: {str(e)}")
78
+ import traceback
79
+ traceback.print_exc()
80
+ return None
81
+
82
+ if __name__ == "__main__":
83
+ # Parse command line arguments
84
+ parser = argparse.ArgumentParser(description="Test SAM2 segmentation")
85
+ parser.add_argument("image_path", help="Path to the input image")
86
+ parser.add_argument("--output-dir", help="Directory to save segmentation results")
87
+ parser.add_argument("--manual-points", action="store_true", help="Use manual center point instead of auto points")
88
+
89
+ args = parser.parse_args()
90
+
91
+ # Run test
92
+ test_sam2_segmentation(
93
+ args.image_path,
94
+ args.output_dir,
95
+ not args.manual_points
96
+ )
@@ -0,0 +1,57 @@
1
+ # Core dependencies
2
+ fastapi>=0.95.0
3
+ uvicorn>=0.21.0
4
+ pydantic>=2.0.0
5
+ python-multipart>=0.0.6
6
+
7
+ # MCP SDK
8
+ git+https://github.com/modelcontextprotocol/python-sdk.git
9
+
10
+ # Image processing
11
+ pillow>=9.5.0
12
+ opencv-python>=4.7.0
13
+
14
+ # HTTP client
15
+ requests>=2.28.0
16
+ httpx>=0.24.0
17
+
18
+ # Utilities
19
+ python-dotenv>=1.0.0
20
+ pyyaml>=6.0
21
+ jinja2>=3.1.2
22
+ numpy>=1.24.0
23
+ uuid>=1.30.0
24
+ tqdm>=4.65.0
25
+
26
+ # Image Generation - Venice.ai API (optional)
27
+ # (using existing requests and python-dotenv)
28
+
29
+ # Image Generation - Google Gemini API
30
+ google-generativeai>=0.3.0
31
+
32
+ # Network and Service Discovery
33
+ zeroconf>=0.39.0
34
+ aiohttp>=3.8.4
35
+
36
+ # 3D Reconstruction - CUDA Multi-View Stereo
37
+ open3d>=0.17.0
38
+ trimesh>=3.21.0
39
+ pyrender>=0.1.45
40
+
41
+ # Remote Processing
42
+ fastapi-utils>=0.2.1
43
+ python-jose>=3.3.0 # For JWT authentication
44
+ aiofiles>=23.1.0
45
+
46
+ # For development
47
+ pytest>=7.3.1
48
+ black>=23.3.0
49
+ isort>=5.12.0
50
+ pytest-asyncio>=0.21.0
51
+
52
+ # Deprecated dependencies (kept for reference)
53
+ # segment-anything-2>=1.0
54
+ # torch>=2.0.0
55
+ # torchvision>=0.15.0
56
+ # pytorch3d>=0.7.4
57
+ # ninja>=1.11.0
@@ -0,0 +1,39 @@
1
+ # Reasoning Trace Framework for OpenSCAD MCP Server
2
+
3
+ This directory contains the Reasoning Trace Framework (RTF) documentation for the OpenSCAD MCP Server project. The RTF provides insight into the design decisions, mental models, and reasoning processes behind the implementation.
4
+
5
+ ## Directory Structure
6
+
7
+ - `/rtfmd/files/` - Shadow file system mirroring the actual source code structure
8
+ - Contains `.md` files with the same names as their corresponding source files
9
+ - Each file documents the reasoning behind the implementation
10
+
11
+ - `/rtfmd/knowledge/` - Domain knowledge documentation
12
+ - `/openscad/` - Knowledge about OpenSCAD and 3D modeling
13
+ - `/ai/` - Knowledge about AI and natural language processing
14
+ - `/nlp/` - Knowledge about natural language parameter extraction
15
+
16
+ - `/rtfmd/decisions/` - Architectural decision records
17
+ - Documents major design decisions and their rationales
18
+
19
+ ## How to Use This Documentation
20
+
21
+ 1. Start with the `/rtfmd/files/src/main.py.md` file to understand the overall architecture
22
+ 2. Explore specific components through their corresponding `.md` files
23
+ 3. Refer to the knowledge directory for domain-specific information
24
+ 4. Review the decisions directory for major architectural decisions
25
+
26
+ ## Tags Used
27
+
28
+ - `<metadata>` - File metadata including author, timestamp, version, etc.
29
+ - `<exploration>` - Documents the exploration process and alternatives considered
30
+ - `<mental-model>` - Explains the mental model used in the implementation
31
+ - `<pattern-recognition>` - Identifies design patterns used
32
+ - `<trade-off>` - Documents trade-offs considered and choices made
33
+ - `<domain-knowledge>` - References to domain knowledge required
34
+ - `<technical-debt>` - Acknowledges technical debt and future improvements
35
+ - `<knowledge-refs>` - References to related knowledge documents
36
+
37
+ ## Contributing
38
+
39
+ When modifying the codebase, please update the corresponding RTF documentation to reflect your reasoning and design decisions.
@@ -0,0 +1,122 @@
1
+ # AI-Driven Code Generation for OpenSCAD
2
+
3
+ <metadata>
4
+ author: devin-ai-integration
5
+ timestamp: 2025-03-21T01:30:00Z
6
+ version: 1.0.0
7
+ tags: [ai, code-generation, openscad, architecture-decision]
8
+ </metadata>
9
+
10
+ ## Decision Context
11
+
12
+ The OpenSCAD MCP Server requires a mechanism to translate natural language descriptions into valid OpenSCAD code. This architectural decision record documents the approach chosen for implementing AI-driven code generation.
13
+
14
+ ## Options Considered
15
+
16
+ ### Option 1: Template-Based Approach
17
+
18
+ A simple approach using predefined templates with parameter substitution.
19
+
20
+ **Pros:**
21
+ - Simple implementation
22
+ - Predictable output
23
+ - Low computational requirements
24
+
25
+ **Cons:**
26
+ - Limited flexibility
27
+ - Cannot handle complex or novel descriptions
28
+ - Requires manual creation of templates for each shape type
29
+
30
+ ### Option 2: Full Machine Learning Approach
31
+
32
+ Using embeddings and neural networks to generate OpenSCAD code directly.
33
+
34
+ **Pros:**
35
+ - Highly flexible
36
+ - Can handle novel descriptions
37
+ - Potential for more natural interaction
38
+
39
+ **Cons:**
40
+ - High computational requirements
41
+ - Requires training data
42
+ - Less predictable output
43
+ - Harder to debug and maintain
44
+
45
+ ### Option 3: Hybrid Pattern Matching with Contextual Rules
46
+
47
+ Combining pattern matching for parameter extraction with rule-based code generation.
48
+
49
+ **Pros:**
50
+ - Good balance of flexibility and predictability
51
+ - Moderate computational requirements
52
+ - Easier to debug and maintain
53
+ - Can be extended with more sophisticated ML in the future
54
+
55
+ **Cons:**
56
+ - More complex than pure template approach
57
+ - Less flexible than full ML approach
58
+ - Requires careful design of rules and patterns
59
+
60
+ ## Decision
61
+
62
+ **Chosen Option: Option 3 - Hybrid Pattern Matching with Contextual Rules**
63
+
64
+ The hybrid approach was selected because it provides a good balance of flexibility, maintainability, and computational efficiency. It allows for handling a wide range of natural language descriptions while maintaining predictable output and being easier to debug than a full ML approach.
65
+
66
+ ## Implementation Details
67
+
68
+ The implementation consists of two main components:
69
+
70
+ 1. **Parameter Extractor**: Uses regex patterns and contextual rules to extract parameters from natural language descriptions.
71
+
72
+ 2. **Code Generator**: Translates extracted parameters into OpenSCAD code using a combination of templates and programmatic generation.
73
+
74
+ The `AIService` class provides the bridge between these components, handling the overall flow from natural language to code.
75
+
76
+ ```python
77
+ class AIService:
78
+ def __init__(self, templates_dir, model_config=None):
79
+ self.templates_dir = templates_dir
80
+ self.model_config = model_config or {}
81
+ self.templates = self._load_templates()
82
+
83
+ def generate_openscad_code(self, context):
84
+ description = context.get("description", "")
85
+ parameters = context.get("parameters", {})
86
+
87
+ # Parse the description to identify key components
88
+ components = self._parse_description(description)
89
+
90
+ # Generate code based on identified components
91
+ code = self._generate_code_from_components(components, parameters)
92
+
93
+ return code
94
+ ```
95
+
96
+ ## Consequences
97
+
98
+ ### Positive
99
+
100
+ - More flexible code generation than a pure template approach
101
+ - Better maintainability than a full ML approach
102
+ - Lower computational requirements
103
+ - Easier to debug and extend
104
+ - Can handle a wide range of natural language descriptions
105
+
106
+ ### Negative
107
+
108
+ - More complex implementation than a pure template approach
109
+ - Requires careful design of patterns and rules
110
+ - May still struggle with very complex or ambiguous descriptions
111
+
112
+ ### Neutral
113
+
114
+ - Will require ongoing maintenance as new shape types and features are added
115
+ - May need to be extended with more sophisticated ML techniques in the future
116
+
117
+ ## Follow-up Actions
118
+
119
+ - Implement unit tests for the AI service
120
+ - Create a comprehensive set of test cases for different description types
121
+ - Document the pattern matching rules and code generation logic
122
+ - Consider adding a feedback mechanism to improve the system over time
@@ -0,0 +1,76 @@
1
+ # Decision: Export Format Selection
2
+
3
+ <metadata>
4
+ author: devin-ai-integration
5
+ timestamp: 2025-03-21T12:00:00Z
6
+ version: 1.0.0
7
+ tags: [export-formats, 3d-printing, decision, prusa, bambu]
8
+ </metadata>
9
+
10
+ ## Context
11
+
12
+ The OpenSCAD MCP Server needs to export 3D models in formats that:
13
+ 1. Preserve parametric properties
14
+ 2. Support metadata
15
+ 3. Are compatible with Prusa and Bambu printers
16
+ 4. Avoid limitations of STL format
17
+
18
+ <exploration>
19
+ We evaluated multiple export formats:
20
+ - STL: Traditional format but lacks metadata
21
+ - CSG: OpenSCAD's native format, fully parametric
22
+ - SCAD: Source code, fully parametric
23
+ - 3MF: Modern format with metadata support
24
+ - AMF: XML-based format with metadata
25
+ - DXF/SVG: 2D formats for laser cutting
26
+ </exploration>
27
+
28
+ ## Decision
29
+
30
+ We will use **3MF as the primary export format** with AMF as a secondary option.
31
+ CSG and SCAD will be supported for users who want to modify the models in OpenSCAD.
32
+
33
+ <mental-model>
34
+ The ideal export format should:
35
+ - Maintain all design parameters
36
+ - Include metadata about the model
37
+ - Be widely supported by popular slicers
38
+ - Have a clean, standardized specification
39
+ - Support multiple objects and materials
40
+ </mental-model>
41
+
42
+ ## Rationale
43
+
44
+ <pattern-recognition>
45
+ Modern 3D printing workflows favor formats that preserve more information than just geometry. The industry is shifting from STL to more capable formats like 3MF.
46
+ </pattern-recognition>
47
+
48
+ - **3MF** is supported by both Prusa and Bambu printer software
49
+ - **3MF** includes support for metadata, colors, and materials
50
+ - **3MF** has a cleaner specification than STL
51
+ - **AMF** offers similar advantages but with less widespread adoption
52
+ - **CSG/SCAD** formats maintain full parametric properties but only within OpenSCAD
53
+
54
+ <trade-off>
55
+ We considered making STL an option for broader compatibility, but this would compromise our goal of preserving parametric properties. The benefits of 3MF outweigh the minor compatibility issues that might arise.
56
+ </trade-off>
57
+
58
+ ## Consequences
59
+
60
+ **Positive:**
61
+ - Better preservation of model information
62
+ - Improved compatibility with modern printer software
63
+ - Future-proof approach as 3MF adoption increases
64
+
65
+ **Negative:**
66
+ - Slightly more complex implementation than STL
67
+ - May require validation to ensure proper format compliance
68
+
69
+ <technical-debt>
70
+ We will need to implement validation for 3MF and AMF files to ensure they meet specifications. This adds complexity but is necessary for reliability.
71
+ </technical-debt>
72
+
73
+ <knowledge-refs>
74
+ - [OpenSCAD Export Formats](/rtfmd/knowledge/openscad/export-formats.md)
75
+ - [OpenSCAD Basics](/rtfmd/knowledge/openscad/openscad-basics.md)
76
+ </knowledge-refs>
@@ -0,0 +1,51 @@
1
+ <metadata>
2
+ author: devin-ai-integration
3
+ timestamp: 2025-03-21T01:30:00Z
4
+ version: 1.0.0
5
+ related-files: [/src/models/code_generator.py]
6
+ prompt: "Implement AI-driven code generator for OpenSCAD"
7
+ </metadata>
8
+
9
+ <exploration>
10
+ The AI service component was designed to provide natural language processing capabilities for generating OpenSCAD code from user descriptions. Initial approaches considered:
11
+
12
+ 1. Using a template-based approach with predefined patterns
13
+ 2. Implementing a full NLP pipeline with custom entity extraction
14
+ 3. Creating a hybrid approach that combines pattern matching with contextual understanding
15
+
16
+ The hybrid approach was selected as it provides flexibility while maintaining performance.
17
+ </exploration>
18
+
19
+ <mental-model>
20
+ The AI service operates on the concept of "component identification" - breaking down natural language descriptions into geometric primitives, operations, features, and modifiers. This mental model aligns with how OpenSCAD itself works, where complex models are built from primitive shapes and CSG operations.
21
+ </mental-model>
22
+
23
+ <pattern-recognition>
24
+ The implementation uses the Strategy pattern for different parsing strategies and the Factory pattern for code generation. These patterns allow for extensibility as new shape types or operations are added.
25
+ </pattern-recognition>
26
+
27
+ <trade-off>
28
+ Options considered:
29
+ 1. Full machine learning approach with embeddings and neural networks
30
+ 2. Rule-based pattern matching with regular expressions
31
+ 3. Hybrid approach with pattern matching and contextual rules
32
+
33
+ The hybrid approach was chosen because:
34
+ - Lower computational requirements than full ML
35
+ - More flexible than pure rule-based systems
36
+ - Easier to debug and maintain
37
+ - Can be extended with more sophisticated ML in the future
38
+ </trade-off>
39
+
40
+ <domain-knowledge>
41
+ The implementation required understanding of:
42
+ - OpenSCAD's modeling paradigm (CSG operations)
43
+ - Common 3D modeling terminology
44
+ - Natural language processing techniques
45
+ - Regular expression pattern matching
46
+ </domain-knowledge>
47
+
48
+ <knowledge-refs>
49
+ [OpenSCAD Basics](/rtfmd/knowledge/openscad/openscad-basics.md) - Last updated 2025-03-21
50
+ [Natural Language Processing](/rtfmd/knowledge/ai/natural-language-processing.md) - Last updated 2025-03-21
51
+ </knowledge-refs>
@@ -0,0 +1,63 @@
1
+ <metadata>
2
+ author: devin-ai-integration
3
+ timestamp: 2025-03-21T01:30:00Z
4
+ version: 1.0.0
5
+ related-files: [/src/ai/ai_service.py, /src/models/code_generator.py, /src/nlp/parameter_extractor.py]
6
+ prompt: "Build an MCP server for OpenSCAD"
7
+ </metadata>
8
+
9
+ <exploration>
10
+ The main application was designed to implement a Model Context Protocol (MCP) server for OpenSCAD integration. Several approaches were considered:
11
+
12
+ 1. Using a standalone server with direct OpenSCAD CLI calls
13
+ 2. Implementing a web service with REST API
14
+ 3. Creating an MCP-compliant server with FastAPI
15
+
16
+ The MCP-compliant FastAPI approach was selected for its alignment with the project requirements and modern API design.
17
+ </exploration>
18
+
19
+ <mental-model>
20
+ The main application operates on a "tool-based MCP service" paradigm, where each capability is exposed as an MCP tool that can be called by AI assistants. This mental model aligns with the MCP specification and provides a clean separation of concerns.
21
+ </mental-model>
22
+
23
+ <pattern-recognition>
24
+ The implementation uses the Facade pattern to provide a simple interface to the complex subsystems (parameter extraction, code generation, OpenSCAD wrapper, etc.). This pattern simplifies the client interface and decouples the subsystems from clients.
25
+ </pattern-recognition>
26
+
27
+ <trade-off>
28
+ Options considered:
29
+ 1. Monolithic application with tightly coupled components
30
+ 2. Microservices architecture with separate services
31
+ 3. Modular monolith with clear component boundaries
32
+
33
+ The modular monolith approach was chosen because:
34
+ - Simpler deployment and operation
35
+ - Lower latency for inter-component communication
36
+ - Easier to develop and debug
37
+ - Still maintains good separation of concerns
38
+ </trade-off>
39
+
40
+ <domain-knowledge>
41
+ The implementation required understanding of:
42
+ - Model Context Protocol (MCP) specification
43
+ - FastAPI framework
44
+ - OpenSCAD command-line interface
45
+ - 3D modeling and printing workflows
46
+ </domain-knowledge>
47
+
48
+ <technical-debt>
49
+ The current implementation has some limitations:
50
+ - In-memory storage of models (not persistent)
51
+ - Basic error handling
52
+ - Limited printer discovery capabilities
53
+
54
+ Future improvements planned:
55
+ - Persistent storage for models
56
+ - Enhanced error handling and reporting
57
+ - More robust printer discovery and management
58
+ </technical-debt>
59
+
60
+ <knowledge-refs>
61
+ [OpenSCAD Basics](/rtfmd/knowledge/openscad/openscad-basics.md) - Last updated 2025-03-21
62
+ [AI-Driven Code Generation](/rtfmd/decisions/ai-driven-code-generation.md) - Last updated 2025-03-21
63
+ </knowledge-refs>
@@ -0,0 +1,63 @@
1
+ <metadata>
2
+ author: devin-ai-integration
3
+ timestamp: 2025-03-21T01:30:00Z
4
+ version: 1.0.0
5
+ related-files: [/src/ai/ai_service.py, /src/nlp/parameter_extractor.py]
6
+ prompt: "Implement AI-driven code generator for OpenSCAD"
7
+ </metadata>
8
+
9
+ <exploration>
10
+ The code generator was designed to translate natural language descriptions and extracted parameters into valid OpenSCAD code. Several approaches were considered:
11
+
12
+ 1. Direct string manipulation for code generation
13
+ 2. Template-based approach with parameter substitution
14
+ 3. Modular approach with separate modules for different shape types
15
+
16
+ The modular approach was selected for its maintainability and extensibility.
17
+ </exploration>
18
+
19
+ <mental-model>
20
+ The code generator operates on a "shape-to-module" mapping paradigm, where each identified shape type corresponds to a specific OpenSCAD module. This mental model allows for clean separation of concerns and makes it easy to add new shape types.
21
+ </mental-model>
22
+
23
+ <pattern-recognition>
24
+ The implementation uses the Factory pattern for code generation, where different shape types are mapped to different module generators. This pattern allows for easy extension with new shape types.
25
+ </pattern-recognition>
26
+
27
+ <trade-off>
28
+ Options considered:
29
+ 1. Generating raw OpenSCAD primitives directly
30
+ 2. Using a library of pre-defined modules
31
+ 3. Hybrid approach with both primitives and modules
32
+
33
+ The library approach was chosen because:
34
+ - More maintainable and readable code
35
+ - Easier to implement complex shapes
36
+ - Better parameter handling
37
+ - More consistent output
38
+ </trade-off>
39
+
40
+ <domain-knowledge>
41
+ The implementation required understanding of:
42
+ - OpenSCAD syntax and semantics
43
+ - Constructive Solid Geometry (CSG) operations
44
+ - Parametric modeling concepts
45
+ - 3D geometry fundamentals
46
+ </domain-knowledge>
47
+
48
+ <technical-debt>
49
+ The current implementation has some limitations:
50
+ - Limited support for complex nested operations
51
+ - No support for custom user-defined modules
52
+ - Basic error handling for invalid parameters
53
+
54
+ Future improvements planned:
55
+ - Enhanced error handling with meaningful messages
56
+ - Support for user-defined modules
57
+ - More sophisticated CSG operation chaining
58
+ </technical-debt>
59
+
60
+ <knowledge-refs>
61
+ [OpenSCAD Basics](/rtfmd/knowledge/openscad/openscad-basics.md) - Last updated 2025-03-21
62
+ [AI-Driven Code Generation](/rtfmd/decisions/ai-driven-code-generation.md) - Last updated 2025-03-21
63
+ </knowledge-refs>
@@ -0,0 +1,63 @@
1
+ <metadata>
2
+ author: devin-ai-integration
3
+ timestamp: 2025-03-21T01:30:00Z
4
+ version: 1.0.0
5
+ related-files: [/src/models/code_generator.py]
6
+ prompt: "Enhance parameter extractor with expanded shape recognition"
7
+ </metadata>
8
+
9
+ <exploration>
10
+ The parameter extractor was designed to parse natural language descriptions and extract structured parameters for 3D model generation. Several approaches were considered:
11
+
12
+ 1. Using a full NLP pipeline with named entity recognition
13
+ 2. Implementing regex-based pattern matching
14
+ 3. Creating a hybrid approach with contextual understanding
15
+
16
+ The regex-based approach with contextual enhancements was selected for its balance of simplicity and effectiveness.
17
+ </exploration>
18
+
19
+ <mental-model>
20
+ The parameter extractor operates on a "pattern recognition and extraction" paradigm, where common phrases and patterns in natural language are mapped to specific parameter types. This mental model allows for intuitive parameter extraction from diverse descriptions.
21
+ </mental-model>
22
+
23
+ <pattern-recognition>
24
+ The implementation uses the Strategy pattern for different parameter extraction strategies based on shape type. This pattern allows for specialized extraction logic for each shape type while maintaining a consistent interface.
25
+ </pattern-recognition>
26
+
27
+ <trade-off>
28
+ Options considered:
29
+ 1. Machine learning-based approach with trained models
30
+ 2. Pure regex pattern matching
31
+ 3. Hybrid approach with contextual rules
32
+
33
+ The regex approach with contextual rules was chosen because:
34
+ - Simpler implementation with good accuracy
35
+ - No training data required
36
+ - Easier to debug and maintain
37
+ - More predictable behavior
38
+ </trade-off>
39
+
40
+ <domain-knowledge>
41
+ The implementation required understanding of:
42
+ - Natural language processing concepts
43
+ - Regular expression pattern matching
44
+ - 3D modeling terminology
45
+ - Parameter types for different geometric shapes
46
+ </domain-knowledge>
47
+
48
+ <technical-debt>
49
+ The current implementation has some limitations:
50
+ - Limited support for complex nested descriptions
51
+ - Regex patterns may need maintenance as language evolves
52
+ - Only supports millimeters as per project requirements
53
+
54
+ Future improvements planned:
55
+ - Enhanced contextual understanding
56
+ - Support for more complex descriptions
57
+ - Better handling of ambiguous parameters
58
+ </technical-debt>
59
+
60
+ <knowledge-refs>
61
+ [Parameter Extraction](/rtfmd/knowledge/nlp/parameter-extraction.md) - Last updated 2025-03-21
62
+ [Natural Language Processing](/rtfmd/knowledge/ai/natural-language-processing.md) - Last updated 2025-03-21
63
+ </knowledge-refs>