-
Notifications
You must be signed in to change notification settings - Fork 0
Releases: JLay2026/partsmith
Releases · JLay2026/partsmith
v0.3.6: opt-in, capped create preview
v0.3.5: robust artifact delivery — verifiable file responses
v0.3.4: dimensioned engineering drawings
v0.3.1 pytest CI + integration suite — defensive layer
v0.2.6 — cross-section renderer
v0.2.5 — partsmith_helpers library
feat(v0.2.4): persistent design store (closes #2)
First v0.3.0 Theme 1 (author ergonomics) item.
Designs are saved to disk under {workspace}/designs/ as {name}.py
(source) + {name}.json (metadata: timestamps, description, geometry
snapshot). Survive container restart; models are still in-memory only.
Two-file persistence (source + sidecar) instead of single JSON so the
source is human-readable on disk (cat workspace/designs/bracket.py)
and git-friendly if the workspace is ever versioned. Sidecar is
bookkeeping that can be regenerated from defaults if missing or corrupt.
API surface:
REST (5 new endpoints):
POST /design/save — save (also executes for geometry snapshot)
GET /design/list — list all (cheap, uses snapshots)
GET /design/{name} — load source + metadata, no execution
DELETE /design/{name} — remove .py + .json
POST /design/{name}/load — load + execute as model
MCP (4 new tools):
partsmith_save_design(name, code, description="")
partsmith_load_design(name)
partsmith_list_designs()
partsmith_delete_design(name)
Design notes:
- save() always tries to execute the code so geometry can be snapshotted
for list() efficiency. If execution fails the save still succeeds —
source is the source of truth.
- save() also registers the result as an in-memory model so the design
is immediately available for render/measure/export without a separate
partsmith_create_model call. Matches likely workflow.
- Same NAME_PATTERN validation as models. Path-traversal defense via
resolved-path-relative-to check (belt+braces on top of regex).
- Thread-safety: not safe for concurrent writes to the same name.
partsmith is single-tenant single-process by design (single uvicorn
worker), so this is acceptable.
Files:
- src/design_store.py — NEW (~180 LOC, full module with docstrings)
- src/server.py — adds 5 REST endpoints, instantiates store, passes to build_mcp
- src/mcp_transport.py — accepts store kwarg, adds 4 MCP tools
- src/__init__.py — version 0.2.4
- pyproject.toml — version 0.2.4
- CHANGELOG.md — v0.2.4 entry with design notes
Validation:
- py_compile clean on all .py files
- ruff check (E,F,I,W) clean
Resolves #2.
Assets 2
v0.2.3
Highlights
First fully-working /mcp release with Cowork's managed MCP UI and other
strict-spec MCP clients. Three deploy-time bugs from v0.2.0 fixed, plus
one stateless-mode upgrade in v0.2.3 itself.
Changes since v0.2.0
- v0.2.1 — FastAPI lifespan integration for FastMCP session_manager
(fixesTask group is not initializedruntime error); clean/mcp/
URL (was double-prefixed/mcp/mcp/); uvicorn--proxy-headers
--forwarded-allow-ips "*"so X-Forwarded-Proto from upstream
reverse proxy is honored. - v0.2.2 — Disable FastMCP DNS rebinding protection (default
rejects any Host header other than localhost/127.0.0.1 with 421
Misdirected Request; out of scope for a perimeter-secured backend). - v0.2.3 — Switch to
stateless_http + json_responsemode. Default
stateful mode keeps a long-poll GET stream open for server-pushed
events, which strict-spec MCP clients mishandle and hang on for
minutes per call. Stateless collapses each MCP call to a single
POST with the response in the body as application/json.
Compatibility
- partsmith tools are all request/response (no streaming output), so
stateless mode loses nothing. - Existing clients that worked in stateful mode (curl, mcp-cli) continue
to work — stateless is a strict subset. - The cad-agent-shim Windows-side translator (deprecated in v0.2.0) is
fully replaced; archive that repo.
Verified deploy
End-to-end through Cowork managed MCP UI on 2026年06月09日. Full pipeline:
Cowork → Caddy → uvicorn → FastAPI → FastMCP /mcp/ → engine + renderer.