dcc-mcp-openscad 0.1.0__tar.gz
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.
- dcc_mcp_openscad-0.1.0/.github/workflows/ci.yml +56 -0
- dcc_mcp_openscad-0.1.0/.github/workflows/release.yml +66 -0
- dcc_mcp_openscad-0.1.0/.gitignore +8 -0
- dcc_mcp_openscad-0.1.0/.release-please-manifest.json +3 -0
- dcc_mcp_openscad-0.1.0/CHANGELOG.md +9 -0
- dcc_mcp_openscad-0.1.0/LICENSE +6 -0
- dcc_mcp_openscad-0.1.0/PKG-INFO +129 -0
- dcc_mcp_openscad-0.1.0/README.md +92 -0
- dcc_mcp_openscad-0.1.0/docs/assets/dcc-mcp-openscad-dark.svg +22 -0
- dcc_mcp_openscad-0.1.0/docs/assets/dcc-mcp-openscad.svg +22 -0
- dcc_mcp_openscad-0.1.0/examples/production_smoke.scad +35 -0
- dcc_mcp_openscad-0.1.0/pyproject.toml +69 -0
- dcc_mcp_openscad-0.1.0/release-please-config.json +15 -0
- dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/__init__.py +3 -0
- dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/__version__.py +1 -0
- dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/bridge.py +589 -0
- dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/server.py +62 -0
- dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skill_tools.py +18 -0
- dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/SKILL.md +36 -0
- dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/scripts/export_model.py +8 -0
- dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/scripts/get_capabilities.py +8 -0
- dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/scripts/get_status.py +9 -0
- dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/scripts/inspect_source.py +9 -0
- dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/scripts/render_preview.py +8 -0
- dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/scripts/validate_model.py +8 -0
- dcc_mcp_openscad-0.1.0/src/dcc_mcp_openscad/skills/openscad-pipeline/tools.yaml +132 -0
- dcc_mcp_openscad-0.1.0/tests/test_bridge.py +211 -0
- dcc_mcp_openscad-0.1.0/tests/test_contracts.py +49 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main, "release-please--branches--**"]
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [main]
|
|
9
|
+
|
|
10
|
+
concurrency:
|
|
11
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
12
|
+
cancel-in-progress: true
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
test:
|
|
19
|
+
name: Test Python ${{ matrix.python }} on ${{ matrix.os }}
|
|
20
|
+
runs-on: ${{ matrix.os }}
|
|
21
|
+
timeout-minutes: 15
|
|
22
|
+
strategy:
|
|
23
|
+
fail-fast: false
|
|
24
|
+
matrix:
|
|
25
|
+
include:
|
|
26
|
+
- {os: ubuntu-22.04, python: "3.7"}
|
|
27
|
+
- {os: windows-2022, python: "3.7"}
|
|
28
|
+
- {os: ubuntu-latest, python: "3.9"}
|
|
29
|
+
- {os: windows-latest, python: "3.9"}
|
|
30
|
+
- {os: macos-latest, python: "3.9"}
|
|
31
|
+
- {os: ubuntu-latest, python: "3.12"}
|
|
32
|
+
- {os: windows-latest, python: "3.12"}
|
|
33
|
+
- {os: macos-latest, python: "3.12"}
|
|
34
|
+
steps:
|
|
35
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
36
|
+
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
|
|
37
|
+
with:
|
|
38
|
+
python-version: ${{ matrix.python }}
|
|
39
|
+
- run: python -m pip install --upgrade pip
|
|
40
|
+
- run: python -m pip install -e ".[test]"
|
|
41
|
+
- run: python -m pytest -m "not openscad"
|
|
42
|
+
|
|
43
|
+
lint-and-build:
|
|
44
|
+
runs-on: ubuntu-latest
|
|
45
|
+
timeout-minutes: 15
|
|
46
|
+
steps:
|
|
47
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
48
|
+
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
|
|
49
|
+
with:
|
|
50
|
+
python-version: "3.12"
|
|
51
|
+
- run: python -m pip install --upgrade pip
|
|
52
|
+
- run: python -m pip install -e ".[dev]"
|
|
53
|
+
- run: python -m ruff check src tests
|
|
54
|
+
- run: python -m ruff format --check src tests
|
|
55
|
+
- run: python -m build
|
|
56
|
+
- run: python -m twine check dist/*
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
tag_name:
|
|
9
|
+
description: Existing tag to rebuild and publish
|
|
10
|
+
required: false
|
|
11
|
+
default: ""
|
|
12
|
+
publish_to_pypi:
|
|
13
|
+
description: Publish a manually rebuilt tag to PyPI
|
|
14
|
+
type: boolean
|
|
15
|
+
required: false
|
|
16
|
+
default: false
|
|
17
|
+
|
|
18
|
+
concurrency:
|
|
19
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
20
|
+
cancel-in-progress: false
|
|
21
|
+
|
|
22
|
+
permissions:
|
|
23
|
+
contents: write
|
|
24
|
+
pull-requests: write
|
|
25
|
+
|
|
26
|
+
jobs:
|
|
27
|
+
release-please:
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
timeout-minutes: 10
|
|
30
|
+
if: github.ref == 'refs/heads/main'
|
|
31
|
+
outputs:
|
|
32
|
+
release_created: ${{ steps.release.outputs.release_created }}
|
|
33
|
+
tag_name: ${{ steps.release.outputs.tag_name || inputs.tag_name }}
|
|
34
|
+
steps:
|
|
35
|
+
- uses: googleapis/release-please-action@0dfd8538845b8e92600d271a895a5372865d4062 # v5
|
|
36
|
+
id: release
|
|
37
|
+
with:
|
|
38
|
+
token: ${{ github.token }}
|
|
39
|
+
config-file: release-please-config.json
|
|
40
|
+
manifest-file: .release-please-manifest.json
|
|
41
|
+
|
|
42
|
+
build-and-publish:
|
|
43
|
+
needs: release-please
|
|
44
|
+
if: needs.release-please.outputs.release_created == 'true' || (github.event_name == 'workflow_dispatch' && inputs.tag_name != '' && inputs.publish_to_pypi)
|
|
45
|
+
runs-on: ubuntu-latest
|
|
46
|
+
timeout-minutes: 15
|
|
47
|
+
environment:
|
|
48
|
+
name: pypi
|
|
49
|
+
url: https://pypi.org/p/dcc-mcp-openscad
|
|
50
|
+
permissions:
|
|
51
|
+
contents: read
|
|
52
|
+
id-token: write
|
|
53
|
+
steps:
|
|
54
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
55
|
+
with:
|
|
56
|
+
ref: ${{ needs.release-please.outputs.tag_name || inputs.tag_name }}
|
|
57
|
+
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
|
|
58
|
+
with:
|
|
59
|
+
python-version: "3.12"
|
|
60
|
+
- run: python -m pip install --upgrade pip build twine
|
|
61
|
+
- run: python -m build
|
|
62
|
+
- run: python -m twine check dist/*
|
|
63
|
+
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
|
|
64
|
+
with:
|
|
65
|
+
verbose: true
|
|
66
|
+
print-hash: true
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0 (2026-08-10)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* add experimental OpenSCAD adapter ([86c0df9](https://github.com/dcc-mcp/dcc-mcp-openscad/commit/86c0df91044b09f2ac0fb174fbff31c084ef408b))
|
|
9
|
+
* make OpenSCAD adapter production ready ([#1](https://github.com/dcc-mcp/dcc-mcp-openscad/issues/1)) ([fe7b4dc](https://github.com/dcc-mcp/dcc-mcp-openscad/commit/fe7b4dce023d61acda6ba8c0c2a798842436dce2))
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 loonghao
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies.
|
|
6
|
+
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: dcc-mcp-openscad
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Production OpenSCAD adapter for deterministic DCC-MCP model validation, export, and rendering
|
|
5
|
+
Project-URL: Homepage, https://github.com/dcc-mcp/dcc-mcp-openscad
|
|
6
|
+
Project-URL: Repository, https://github.com/dcc-mcp/dcc-mcp-openscad
|
|
7
|
+
Project-URL: Issues, https://github.com/dcc-mcp/dcc-mcp-openscad/issues
|
|
8
|
+
Author-email: loonghao <hal.long@outlook.com>
|
|
9
|
+
License: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: automation,cad,dcc,mcp,openscad,parametric-modeling
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.7
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Requires-Python: >=3.7
|
|
23
|
+
Requires-Dist: dcc-mcp-core<1.0.0,>=0.19.91
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: build>=1.2; extra == 'dev'
|
|
26
|
+
Requires-Dist: pytest<8,>=7.4; (python_version < '3.8') and extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest>=8; (python_version >= '3.8') and extra == 'dev'
|
|
28
|
+
Requires-Dist: pyyaml>=6; extra == 'dev'
|
|
29
|
+
Requires-Dist: ruff>=0.8; extra == 'dev'
|
|
30
|
+
Requires-Dist: twine>=6; extra == 'dev'
|
|
31
|
+
Provides-Extra: test
|
|
32
|
+
Requires-Dist: pytest<8,>=7.4; (python_version < '3.8') and extra == 'test'
|
|
33
|
+
Requires-Dist: pytest>=8; (python_version >= '3.8') and extra == 'test'
|
|
34
|
+
Requires-Dist: pyyaml>=6; extra == 'test'
|
|
35
|
+
Requires-Dist: ruff>=0.8; extra == 'test'
|
|
36
|
+
Description-Content-Type: text/markdown
|
|
37
|
+
|
|
38
|
+
# dcc-mcp-openscad
|
|
39
|
+
|
|
40
|
+
<p align="center">
|
|
41
|
+
<img src="docs/assets/dcc-mcp-openscad.svg" alt="DCC-MCP · OPENSCAD" width="600">
|
|
42
|
+
</p>
|
|
43
|
+
|
|
44
|
+
Production OpenSCAD adapter for deterministic model inspection, validation,
|
|
45
|
+
geometry export, and PNG rendering through DCC-MCP.
|
|
46
|
+
|
|
47
|
+
## Capabilities
|
|
48
|
+
|
|
49
|
+
- Detect the standalone OpenSCAD CLI and report version-specific capabilities.
|
|
50
|
+
- Inspect modules, functions, variables, and `include`/`use` references without
|
|
51
|
+
executing source.
|
|
52
|
+
- Validate a parameterized model with structured warning/error diagnostics.
|
|
53
|
+
- Export STL (explicit binary or ASCII), 3MF, AMF, OFF, CSG, DXF, SVG, PDF,
|
|
54
|
+
and OpenSCAD diagnostic formats.
|
|
55
|
+
- Render bounded PNG previews or full geometry renders with typed camera,
|
|
56
|
+
projection, color-scheme, size, and parameter inputs.
|
|
57
|
+
- Stage outputs atomically and return file size plus SHA-256 provenance.
|
|
58
|
+
|
|
59
|
+
The adapter does not accept arbitrary OpenSCAD command-line arguments or raw
|
|
60
|
+
`-D` expressions. JSON scalar/array parameters are encoded by the adapter.
|
|
61
|
+
|
|
62
|
+
## Requirements
|
|
63
|
+
|
|
64
|
+
- Python 3.7+
|
|
65
|
+
- `dcc-mcp-core` 0.19.91+
|
|
66
|
+
- OpenSCAD 2021.01 or newer
|
|
67
|
+
|
|
68
|
+
On Windows, point to `openscad.com` when possible; if `openscad.exe` is
|
|
69
|
+
configured and a sibling `openscad.com` exists, the adapter selects the console
|
|
70
|
+
launcher automatically.
|
|
71
|
+
|
|
72
|
+
## Install
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
python -m pip install dcc-mcp-openscad
|
|
76
|
+
dcc-mcp-openscad
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
For development:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
python -m pip install -e ".[dev]"
|
|
83
|
+
python -m pytest
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Configuration
|
|
87
|
+
|
|
88
|
+
| Variable | Purpose | Default |
|
|
89
|
+
| --- | --- | --- |
|
|
90
|
+
| `DCC_MCP_OPENSCAD_EXECUTABLE` | Exact OpenSCAD executable or install directory | `PATH` and standard install locations |
|
|
91
|
+
| `DCC_MCP_OPENSCAD_ALLOWED_ROOTS` | `os.pathsep`-separated source/output roots | server working directory |
|
|
92
|
+
| `DCC_MCP_OPENSCAD_MAX_SOURCE_BYTES` | Maximum source size | 4 MiB |
|
|
93
|
+
| `DCC_MCP_OPENSCAD_MAX_TIMEOUT_SECS` | Maximum per-call deadline | 1800 seconds |
|
|
94
|
+
| `DCC_MCP_OPENSCAD_PORT` | Fixed adapter port when direct addressing is required | OS-assigned |
|
|
95
|
+
|
|
96
|
+
The service registers as a standalone DCC-MCP instance. It has no bound GUI
|
|
97
|
+
PID and needs no OpenSCAD window.
|
|
98
|
+
|
|
99
|
+
## Agent workflow
|
|
100
|
+
|
|
101
|
+
Use the standard discovery path:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
dcc-mcp-cli list
|
|
105
|
+
dcc-mcp-cli search --query "OpenSCAD validate export STL"
|
|
106
|
+
dcc-mcp-cli load-skill openscad-pipeline --dcc-type openscad --instance-id <instance-short>
|
|
107
|
+
dcc-mcp-cli describe openscad.<instance-short>.openscad_pipeline__validate_model
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Then call `inspect_source` → `validate_model` → `export_model` or
|
|
111
|
+
`render_preview`. Long calls are asynchronous and should be polled through the
|
|
112
|
+
core job tools returned by the call.
|
|
113
|
+
|
|
114
|
+
`examples/production_smoke.scad` is a parameterized enclosure used by the live
|
|
115
|
+
acceptance test. Override `width`, `depth`, `height`, `wall`, `corner_radius`,
|
|
116
|
+
or `vent_count` to verify safe parameter encoding and reproducible artifacts.
|
|
117
|
+
|
|
118
|
+
## Safety contract
|
|
119
|
+
|
|
120
|
+
- Source and output paths must remain under configured allowed roots.
|
|
121
|
+
- Existing outputs are never replaced unless `overwrite=true` is explicit.
|
|
122
|
+
- Exports use sibling temporary files and become visible only after success.
|
|
123
|
+
- Parameter names, values, nesting, count, image dimensions, formats, and
|
|
124
|
+
deadlines are bounded.
|
|
125
|
+
- Cancellation and timeouts terminate the owned OpenSCAD child process.
|
|
126
|
+
- Captured process output is limited to 64 KiB per stream.
|
|
127
|
+
|
|
128
|
+
OpenSCAD CLI reference:
|
|
129
|
+
<https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_OpenSCAD_in_a_command_line_environment>
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# dcc-mcp-openscad
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="docs/assets/dcc-mcp-openscad.svg" alt="DCC-MCP · OPENSCAD" width="600">
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
Production OpenSCAD adapter for deterministic model inspection, validation,
|
|
8
|
+
geometry export, and PNG rendering through DCC-MCP.
|
|
9
|
+
|
|
10
|
+
## Capabilities
|
|
11
|
+
|
|
12
|
+
- Detect the standalone OpenSCAD CLI and report version-specific capabilities.
|
|
13
|
+
- Inspect modules, functions, variables, and `include`/`use` references without
|
|
14
|
+
executing source.
|
|
15
|
+
- Validate a parameterized model with structured warning/error diagnostics.
|
|
16
|
+
- Export STL (explicit binary or ASCII), 3MF, AMF, OFF, CSG, DXF, SVG, PDF,
|
|
17
|
+
and OpenSCAD diagnostic formats.
|
|
18
|
+
- Render bounded PNG previews or full geometry renders with typed camera,
|
|
19
|
+
projection, color-scheme, size, and parameter inputs.
|
|
20
|
+
- Stage outputs atomically and return file size plus SHA-256 provenance.
|
|
21
|
+
|
|
22
|
+
The adapter does not accept arbitrary OpenSCAD command-line arguments or raw
|
|
23
|
+
`-D` expressions. JSON scalar/array parameters are encoded by the adapter.
|
|
24
|
+
|
|
25
|
+
## Requirements
|
|
26
|
+
|
|
27
|
+
- Python 3.7+
|
|
28
|
+
- `dcc-mcp-core` 0.19.91+
|
|
29
|
+
- OpenSCAD 2021.01 or newer
|
|
30
|
+
|
|
31
|
+
On Windows, point to `openscad.com` when possible; if `openscad.exe` is
|
|
32
|
+
configured and a sibling `openscad.com` exists, the adapter selects the console
|
|
33
|
+
launcher automatically.
|
|
34
|
+
|
|
35
|
+
## Install
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
python -m pip install dcc-mcp-openscad
|
|
39
|
+
dcc-mcp-openscad
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
For development:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
python -m pip install -e ".[dev]"
|
|
46
|
+
python -m pytest
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Configuration
|
|
50
|
+
|
|
51
|
+
| Variable | Purpose | Default |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| `DCC_MCP_OPENSCAD_EXECUTABLE` | Exact OpenSCAD executable or install directory | `PATH` and standard install locations |
|
|
54
|
+
| `DCC_MCP_OPENSCAD_ALLOWED_ROOTS` | `os.pathsep`-separated source/output roots | server working directory |
|
|
55
|
+
| `DCC_MCP_OPENSCAD_MAX_SOURCE_BYTES` | Maximum source size | 4 MiB |
|
|
56
|
+
| `DCC_MCP_OPENSCAD_MAX_TIMEOUT_SECS` | Maximum per-call deadline | 1800 seconds |
|
|
57
|
+
| `DCC_MCP_OPENSCAD_PORT` | Fixed adapter port when direct addressing is required | OS-assigned |
|
|
58
|
+
|
|
59
|
+
The service registers as a standalone DCC-MCP instance. It has no bound GUI
|
|
60
|
+
PID and needs no OpenSCAD window.
|
|
61
|
+
|
|
62
|
+
## Agent workflow
|
|
63
|
+
|
|
64
|
+
Use the standard discovery path:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
dcc-mcp-cli list
|
|
68
|
+
dcc-mcp-cli search --query "OpenSCAD validate export STL"
|
|
69
|
+
dcc-mcp-cli load-skill openscad-pipeline --dcc-type openscad --instance-id <instance-short>
|
|
70
|
+
dcc-mcp-cli describe openscad.<instance-short>.openscad_pipeline__validate_model
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Then call `inspect_source` → `validate_model` → `export_model` or
|
|
74
|
+
`render_preview`. Long calls are asynchronous and should be polled through the
|
|
75
|
+
core job tools returned by the call.
|
|
76
|
+
|
|
77
|
+
`examples/production_smoke.scad` is a parameterized enclosure used by the live
|
|
78
|
+
acceptance test. Override `width`, `depth`, `height`, `wall`, `corner_radius`,
|
|
79
|
+
or `vent_count` to verify safe parameter encoding and reproducible artifacts.
|
|
80
|
+
|
|
81
|
+
## Safety contract
|
|
82
|
+
|
|
83
|
+
- Source and output paths must remain under configured allowed roots.
|
|
84
|
+
- Existing outputs are never replaced unless `overwrite=true` is explicit.
|
|
85
|
+
- Exports use sibling temporary files and become visible only after success.
|
|
86
|
+
- Parameter names, values, nesting, count, image dimensions, formats, and
|
|
87
|
+
deadlines are bounded.
|
|
88
|
+
- Cancellation and timeouts terminate the owned OpenSCAD child process.
|
|
89
|
+
- Captured process output is limited to 64 KiB per stream.
|
|
90
|
+
|
|
91
|
+
OpenSCAD CLI reference:
|
|
92
|
+
<https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_OpenSCAD_in_a_command_line_environment>
|