Skip to content

Releases: JLay2026/partsmith

v0.3.6: opt-in, capped create preview

12 Jun 02:37
3584ca0

Choose a tag to compare

Merge pull request #21 from JLay2026/feat/optional-preview

v0.3.6: opt-in, capped create preview (#20)

v0.3.5: robust artifact delivery — verifiable file responses

12 Jun 01:35
dd03ca1

Choose a tag to compare

Merge pull request #19 from JLay2026/feat/robust-artifact-delivery

v0.3.5: robust artifact delivery — verifiable file responses (#18)

v0.3.4: dimensioned engineering drawings

11 Jun 22:26
f4d6729

Choose a tag to compare

Merge pull request #17 from JLay2026/feat/dimensioned-drawings

v0.3.4: dimensioned engineering drawings (#12)

v0.3.1 pytest CI + integration suite — defensive layer

11 Jun 02:55
aca64ac

Choose a tag to compare

Merge pull request #11 from JLay2026/feat/pytest-ci-integration

feat(v0.3.1): pytest CI + integration suite — defensive layer (closes #5)

v0.2.6 — cross-section renderer

11 Jun 01:37
6121b99

Choose a tag to compare

Merge pull request #9 from JLay2026/feat/cross-section-renderer

feat(v0.2.6): cross-section renderer — see inside designs inline (closes #8)

v0.2.5 — partsmith_helpers library

11 Jun 01:08
9357e1c

Choose a tag to compare

Merge pull request #7 from JLay2026/feat/partsmith-helpers

feat(v0.2.5): partsmith_helpers library — 7 reusable build123d patterns (closes #1)

feat(v0.2.4): persistent design store (closes #2)

10 Jun 03:24

Choose a tag to compare

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.

v0.2.3

09 Jun 20:23

Choose a tag to compare

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
    (fixes Task group is not initialized runtime 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_response mode. 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.