@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.
- package/README.md +116 -0
- package/config/mcp/antigravity.json +22 -0
- package/config/mcp/claude.json +22 -0
- package/config/mcp/codex.toml +25 -0
- package/docs/adr/ADR-001-KICAD-OPENSCAD-MCP-STRATEGY.md +334 -0
- package/docs/review_documentation.md +121 -0
- package/installer.js +358 -0
- package/mcp_servers/kicad-mcp-server/.env.example +22 -0
- package/mcp_servers/kicad-mcp-server/.github/workflows/ci.yml +36 -0
- package/mcp_servers/kicad-mcp-server/CLAUDE.md +487 -0
- package/mcp_servers/kicad-mcp-server/README.md +316 -0
- package/mcp_servers/kicad-mcp-server/docs/DEVICE_TREE.md +416 -0
- package/mcp_servers/kicad-mcp-server/docs/INSTALLATION.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/PIN_ANALYSIS.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/README.md +240 -0
- package/mcp_servers/kicad-mcp-server/docs/TESTING.md +613 -0
- package/mcp_servers/kicad-mcp-server/docs/VALIDATION.md +268 -0
- package/mcp_servers/kicad-mcp-server/pyproject.toml +96 -0
- package/mcp_servers/kicad-mcp-server/requirements-dev.txt +16 -0
- package/mcp_servers/kicad-mcp-server/requirements-test.txt +24 -0
- package/mcp_servers/kicad-mcp-server/requirements.txt +13 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__init__.py +3 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__main__.py +17 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/config.py +46 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/types.py +87 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/netlist_parser.py +234 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser.py +375 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser_kicad.py +327 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/schematic_parser.py +902 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/server.py +71 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/arduino/connectivity_test.cpp.j2 +189 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/atmega.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/esp32.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/nrf52.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/stm32f4.dts.j2 +89 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/esp_idf/test_suite.c.j2 +340 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/pytest/test_connectivity.py.j2 +147 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/st_hal/hal_test.c.j2 +313 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_gpio_test.py.j2 +99 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_i2c_test.py.j2 +117 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_pinmux_test.py.j2 +43 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_spi_test.py.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_gpio_test.c.j2 +113 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_i2c_test.c.j2 +101 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_spi_test.c.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/unittest/test_schematic.py.j2 +172 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/__init__.py +36 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/device_tree.py +1187 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/hierarchical_analysis.py +211 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/netlist.py +320 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/parts_registry.py +142 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb.py +955 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb_layout.py +308 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pin_analysis.py +765 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/project.py +196 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic.py +319 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_editor.py +674 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_search.py +158 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/validation.py +866 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/visualization.py +225 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/file_handlers.py +65 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_cli.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_version.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/parts_registry.py +197 -0
- package/mcp_servers/kicad-mcp-server/tests/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/examples/ESP32S3_TEST.md +219 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/README.md +65 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_pcb.kicad_pcb +177 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_schematic.kicad_sch +145 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/child.kicad_sch +24 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/root.kicad_sch +38 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_hierarchical_labels.py +195 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_kicad_cli.py +116 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_netlist_cache_path.py +29 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic.py +189 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic_hierarchy.py +69 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_visualization.py +136 -0
- package/mcp_servers/kicad-mcp-server/uv.lock +2873 -0
- package/mcp_servers/openscad-mcp-server/.dockerignore +9 -0
- package/mcp_servers/openscad-mcp-server/.github/workflows/test.yml +40 -0
- package/mcp_servers/openscad-mcp-server/Dockerfile +29 -0
- package/mcp_servers/openscad-mcp-server/LICENSE +21 -0
- package/mcp_servers/openscad-mcp-server/README.md +154 -0
- package/mcp_servers/openscad-mcp-server/docs/audit.md +56 -0
- package/mcp_servers/openscad-mcp-server/docs/docker.md +66 -0
- package/mcp_servers/openscad-mcp-server/docs/issue-followup.md +19 -0
- package/mcp_servers/openscad-mcp-server/docs/jetson.md +17 -0
- package/mcp_servers/openscad-mcp-server/glama.json +4 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.md +15 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.original.md +294 -0
- package/mcp_servers/openscad-mcp-server/legacy/implementation_plan.md +100 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/download_sam2_checkpoint.py +115 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/ai/sam_segmentation.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/models/threestudio_generator.py +231 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/workflow/image_to_model_pipeline.py +260 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/test_sam2_segmentation.py +96 -0
- package/mcp_servers/openscad-mcp-server/legacy/requirements.txt +57 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/README.md +39 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/ai-driven-code-generation.md +122 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/export-formats.md +76 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/ai/ai_service.py.md +51 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/main.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/models/code_generator.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/nlp/parameter_extractor.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/ai/natural-language-processing.md +78 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/nlp/parameter-extraction.md +173 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/export-formats.md +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/openscad-basics.md +66 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/primitive-testing.md +79 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/ai_service.py +257 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/gemini_api.py +161 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/venice_api.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/config.py +121 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py +1456 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py.new +404 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main_remote.py +401 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/code_generator.py +321 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/cuda_mvs.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/scad_templates/basic_shapes.scad +144 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/parameter_extractor.py +388 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/wrapper.py +418 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/printer_discovery.py +471 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/connection_manager.py +537 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_client.py +435 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_server.py +787 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/error_handling.py +415 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/primitive_tester.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/test_primitives.py +98 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/cad_exporter.py +241 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/format_validator.py +206 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_exporter.py +140 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_repair.py +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_validator.py +123 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/headless_renderer.py +52 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/renderer.py +177 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/web_interface.py +639 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/image_approval.py +148 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/multi_view_to_model_pipeline.py +338 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_complete_workflow.py +374 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_cuda_mvs.py +191 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_gemini_api.py +168 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval.py +192 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval_workflow.py +251 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_to_model_pipeline.py +145 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_model_selection.py +41 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_multi_view_pipeline.py +290 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_primitives.sh +13 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_rabbit_direct.py +71 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_remote_cuda_mvs.py +283 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_venice_example.py +69 -0
- package/mcp_servers/openscad-mcp-server/pyproject.toml +33 -0
- package/mcp_servers/openscad-mcp-server/requirements.txt +2 -0
- package/mcp_servers/openscad-mcp-server/scad/simple_cube.scad +2 -0
- package/mcp_servers/openscad-mcp-server/scripts/test_docker.py +220 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__init__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__main__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/engine.py +94 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/geometry.py +242 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/server.py +245 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/service.py +190 -0
- package/mcp_servers/openscad-mcp-server/tests/conftest.py +17 -0
- package/mcp_servers/openscad-mcp-server/tests/test_engine.py +37 -0
- package/mcp_servers/openscad-mcp-server/tests/test_geometry.py +106 -0
- package/mcp_servers/openscad-mcp-server/tests/test_integration.py +172 -0
- package/mcp_servers/openscad-mcp-server/tests/test_transports.py +314 -0
- package/mcp_servers/openscad-mcp-server/uv.lock +1123 -0
- package/package.json +44 -0
- package/scripts/install_mcps.sh +86 -0
- package/scripts/openscad_wrapper.sh +62 -0
- package/scripts/run_kicad_mcp.sh +25 -0
- package/scripts/run_openscad_mcp.sh +41 -0
- package/scripts/test_mcp_connection.py +626 -0
- package/scripts/test_mcp_connection.sh +168 -0
- package/skills/code-first-hardware-design/SKILL.md +260 -0
- package/skills/pcb-constraint-definition/SKILL.md +236 -0
- package/skills/pcb-layout-routing-automation/SKILL.md +153 -0
- package/skills/pcb-validation-dfm-signoff/SKILL.md +194 -0
- 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>
|