Rename SolveCraft to SolidCraft everywhere, with compatibility shims (#389)

* WIP deep rename (not for push)

* WIP2

* WIP3

* WIP4 wxs fix

* rustfmt

* Rename the remaining identifiers in merged crash-report code

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01RjGw4gA5ZvKrU8MQP6sBgT

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
This commit is contained in:
bherbruckandClaude Opus 5.5 authored and GitHub committed 2026-10-12 17:17:01 -04:00
1 parent 27415e4dd7
commit 296683229d
464 files changed
+3408 -2956

No files matched your search

+1 -1
View File
@@ -5,7 +5,7 @@ SolidCraft is a Cargo workspace in layers. A crate only depends on crates in low
{{#include ../../../../README.md:architecture}}
The web app, `apps/solvecraft-web`, is the desktop front end compiled to wasm with
The web app, `apps/solidcraft-web`, is the desktop front end compiled to wasm with
[trunk](https://trunkrs.dev). `xtask` holds the repository's own tooling: `cargo xtask ci`,
`layers`, `assets`, `features`, `oracle` and `book`.
+1 -1
View File
@@ -16,7 +16,7 @@ CommandSpec::new("solid.fillet", "Fillet", fillet)
`run` is `fn(&mut Session, &Value) -> Result<Value>`, and `enabled` is
`fn(&Session) -> Result<(), String>`; the error string is the disabled-button tooltip. The
`params` string is the one-line documentation shown by `solvecraft-cli commands`, MCP's
`params` string is the one-line documentation shown by `solidcraft-cli commands`, MCP's
`list_commands` and the [command reference](../reference/commands.md).
A command that changes the design is undoable by default: the session snapshots the document
+1 -1
View File
@@ -9,7 +9,7 @@ SolidCraft types (`Body`, face and edge indices, meshes, measures) and a
## `guard`
truck can panic on geometry it doesn't handle. Every call into it goes through
`solvecraft_kernel::guard`, which catches the panic and turns it into
`solidcraft_kernel::guard`, which catches the panic and turns it into
`KernelError::Internal`, leaving the model unchanged:
```rust
+1 -1
View File
@@ -2,7 +2,7 @@
A fillet stores the edges it rounds, a sketch the face it sits on, a shell the faces it opens.
If those were face and edge *indices*, an upstream edit that adds a face would move the fillet
to another edge. SolveCraft stores **names**, and finds them again every time the timeline
to another edge. SolidCraft stores **names**, and finds them again every time the timeline
evaluates.
## Why names follow the kernel's history
+5 -5
View File
@@ -11,8 +11,8 @@ profile and the wasm build check.
| Sketch fuzz | `crates/engine/src/cmd/sketch_fuzz_tests.rs` | random sketches through the solver and profile finder |
| UI scenarios | `crates/ui-egui/tests/scenarios/*.json` | the real app, headless: clicks, keys, drags, assertions |
| Layout tests | `crates/ui-egui/tests/ui_layout.rs`, `window_widths.rs` | panels and dialogs at every window width |
| Design-file corpus | `apps/solvecraft-cli/tests/corpus` | every saved file version still opens and evaluates the same |
| Kill mid-save | `apps/solvecraft-cli/tests/kill_mid_save.rs` | a save killed at any moment leaves a readable file |
| Design-file corpus | `apps/solidcraft-cli/tests/corpus` | every saved file version still opens and evaluates the same |
| Kill mid-save | `apps/solidcraft-cli/tests/kill_mid_save.rs` | a save killed at any moment leaves a readable file |
| Reference tests | `cargo xtask oracle` → [docs/oracle.md](oracle.md) | parts rebuilt from `tests/oracle/*/recipe.json`, compared with analytic or FreeCAD expected values |
## UI scenarios
@@ -54,12 +54,12 @@ On GitHub, one job builds the tests into a
Pull requests skip a few heavy tests (each takes one to four minutes); they run on every push to
`main`, nightly, and in `cargo xtask test`:
- `solvecraft-engine`: `tests::hostile_params_never_panic`, everything in `tests::robustness`,
- `solidcraft-engine`: `tests::hostile_params_never_panic`, everything in `tests::robustness`,
`pattern_suppress_tests::enclosure_arc_extinction_keeps_a_real_sharp_inner_lip_after_resize_and_reopen`,
`pattern_suppress_tests::enclosure_datums_follow_wall_height_and_board_depth_with_material_proofs`,
`cmd::plastic::tests::enclosure_snap_fit_follows_resized_front_wall`
- `solvecraft-kernel`: `tests::boolean_identity_on_tangent_primitives`
- `solvecraft-ui-egui` scenarios: `acceptance_sensor_enclosure`
- `solidcraft-kernel`: `tests::boolean_identity_on_tangent_primitives`
- `solidcraft-ui-egui` scenarios: `acceptance_sensor_enclosure`
To run exactly what a pull request runs: `cargo nextest run --cargo-profile ci --profile ci`;
add `--ignore-default-filter` for the full set. A new test that takes over a minute on CI can
+2 -2
View File
@@ -2,7 +2,7 @@
| Format | Read | Write |
|---|---|---|
| `.solvecraft` (JSON design, versioned) | yes | yes |
| `.solidcraft` (JSON design, versioned) | yes | yes |
| STEP (AP203, AP214, AP242) | solids, assemblies, units, names, colours | AP242 with names, colours and the component tree |
| IGES 5.3 | manifold solids, or trimmed surfaces sewn into solids | manifold solids with names and colours |
| 3MF, STL, OBJ | mesh bodies | yes |
@@ -53,7 +53,7 @@ another device.
1. Open the File menu and choose **Open** to show **Files in this browser**.
2. Choose **Download open design** for the current design, including its unsaved changes,
or **Download** beside a stored file for its last saved contents.
3. Find the `.solvecraft` file in your browser's downloads. Whether a folder chooser appears
3. Find the `.solidcraft` file in your browser's downloads. Whether a folder chooser appears
depends on your browser's download settings.
Use **Open from computer…** in the same panel to reopen a downloaded design. The web app
+17 -22
View File
@@ -1,8 +1,8 @@
# Getting started
SolidCraft keeps its compatibility names: the desktop executable is `solvecraft`, the CLI
is `solvecraft-cli`, and saved designs remain `.solvecraft`. Published 0.2.0 and 0.2.1 packages
were released under the SolveCraft name.
The desktop executable is `solidcraft`, the CLI is `solidcraft-cli`, and designs are saved as
`.solidcraft`. Designs, settings and setups from builds released under the previous product name keep
working (see the [compatibility notes](https://github.com/bherbruck/solidcraft/blob/main/docs/compatibility.md)).
## Desktop
@@ -15,20 +15,16 @@ git clone https://github.com/bherbruck/solidcraft && cd solidcraft
cargo run --release -p solidcraft -- --sample # opens with a sample part
```
`solvecraft part.step` opens a STEP, IGES, 3MF, STL or OBJ file as a new design, and
`solvecraft design.solvecraft` opens a saved design. Windows builds cross-compile from Linux with
`solidcraft part.step` opens a STEP, IGES, 3MF, STL or OBJ file as a new design, and
`solidcraft design.solidcraft` opens a saved design. Windows builds cross-compile from Linux with
`cargo xwin build --release --target x86_64-pc-windows-msvc -p solidcraft`.
### macOS
Open the release `.dmg` and drag `SolidCraft.app` onto Applications.
When updating from an older `SolveCraft.app`, quit the app and rename the existing
app in Applications to `SolidCraft.app` first. Then drag the new app onto Applications
and choose **Replace**. If you already have both names installed, move the old
`SolveCraft.app` to the Trash. The DMG does not remove old installations automatically.
Remove any Dock shortcut with the old name, open the new app from Applications, and
choose **Options > Keep in Dock**. Designs, settings and the bundle ID are unchanged.
When updating from a build released under the previous product name, follow the
[macOS upgrade notes](https://github.com/bherbruck/solidcraft/blob/main/docs/compatibility.md#macos) so you replace it rather than install a second copy.
### Linux Flatpak
@@ -38,21 +34,20 @@ to the same user installation:
```sh
flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
flatpak remote-add --user --if-not-exists solvecraft https://bherbruck.github.io/solidcraft/flatpak/solvecraft.flatpakrepo
flatpak install --user solvecraft ai.storyteller.solvecraft
flatpak remote-add --user --if-not-exists solidcraft https://bherbruck.github.io/solidcraft/flatpak/solidcraft.flatpakrepo
flatpak install --user solidcraft ai.storyteller.solvecraft
flatpak run ai.storyteller.solvecraft
```
The application ID and remote name retain their compatibility names. To update an existing
remote that still uses the former website address, run
`flatpak remote-modify --user --url=https://bherbruck.github.io/solidcraft/flatpak/repo/ solvecraft`
and then `flatpak update --user`.
The application ID is unchanged, so existing installations keep
receiving updates under whatever remote name they were added with (see the
[compatibility notes](https://github.com/bherbruck/solidcraft/blob/main/docs/compatibility.md#package-ids)).
Alternatively, download the release's `.flatpak` file for your architecture and run
`flatpak install --user ./solvecraft-VERSION-linux-ARCH.flatpak`. The bundle supplies the
`flatpak install --user ./solidcraft-VERSION-linux-ARCH.flatpak`. The bundle supplies the
Flathub runtime repository address; installation still needs internet access to fetch any
missing runtime. Launch with `flatpak run ai.storyteller.solvecraft`, rather than looking for
a host `solvecraft` binary. Files chosen through Open/Save use the desktop file-chooser portal;
a host `solidcraft` binary. Files chosen through Open/Save use the desktop file-chooser portal;
command-line paths outside Documents may need a specific additional filesystem permission.
## Web
@@ -63,12 +58,12 @@ file storage, which needs HTTPS or localhost. To build it yourself:
```sh
rustup target add wasm32-unknown-unknown
cd apps/solvecraft-web && trunk serve --release
cd apps/solidcraft-web && trunk serve --release
```
## CLI
`solvecraft-cli` runs the same commands without a window:
`solidcraft-cli` runs the same commands without a window:
```sh
cargo run --release -p solidcraft-cli -- commands # every command, as JSON
@@ -90,7 +85,7 @@ A script is a list of commands:
]}
```
![The bracket example, rendered by solvecraft-cli snapshot](../generated/bracket.png)
![The bracket example, rendered by solidcraft-cli snapshot](../generated/bracket.png)
Units are millimetres and degrees unless an expression says otherwise (`"1 in"`, `"30 deg"`),
and Z is up.
+2 -2
View File
@@ -11,7 +11,7 @@ It runs as:
- a **desktop app** for Windows and Linux (egui + wgpu);
- a **web app** in the browser (wasm, WebGPU or WebGL2), [try it here](app/);
- a **headless CLI**, `solvecraft-cli`, that runs command scripts, measures and exports;
- a **headless CLI**, `solidcraft-cli`, that runs command scripts, measures and exports;
- an **MCP server** that AI agents model with, headless or driving the running app.
Everything the user can do is a *command* with JSON parameters. The toolbar, the dialogs, scripts,
@@ -24,7 +24,7 @@ and a plastic-enclosure subset work; surfaces, drawings, CAM and simulation are
the [feature list](dev/features.md) lists every command by area, and the
[reference tests](dev/oracle.md) check modelling results against analytic and FreeCAD values.
Existing `.solvecraft` designs and `solvecraft-cli` commands keep their names and behavior.
Existing `.solidcraft` designs and `solidcraft-cli` commands keep their names and behavior.
This book has two halves: the **user guide** for people modelling with SolidCraft, and the
**developer guide** for people working on it. The [command reference](reference/commands.md) is
+123 -20
View File
@@ -1,26 +1,129 @@
# Compatibility shims for the SolveCraft → SolidCraft rename
# Compatibility with the SolveCraft name
The product is SolidCraft everywhere. The old name survives only in the shims listed here,
each kept so that existing installs, scripts and files keep working. Remove a shim only in a
release whose notes say so.
SolidCraft was first called SolveCraft, and builds up to 0.4 kept that name in their
identifiers after the displayed name changed. 0.5.0 renamed the binaries, release assets and
packages; the release after it renames everything else: crates `solidcraft-*`, binaries `solidcraft` and `solidcraft-cli`, `.solidcraft`
designs, the `"format": "solidcraft/N"` tag, `SOLIDCRAFT_*` environment variables, settings
and recovery folders, the MCP server name, docs, CI and packaging.
## Programs and packages (since 0.5.0)
The old name survives **only** in the shims below (plus their tests, this file, and changelog /
release notes). `git grep -i solvecraft` must list nothing else. When you add or remove a
shim, update this file in the same PR.
| Shim | Where | Why | Test |
## 1. `.solvecraft` design files
New designs are saved as `.solidcraft`. Files with the old extension still open everywhere:
| Path in | Where |
|---|---|
| Extension → design format | `crates/io/src/lib.rs` (`LEGACY_DESIGN_EXT`, format detection) |
| Open dialog filters (desktop) | `apps/solidcraft/src/main.rs` (`services`) |
| Drag-drop, recent files, `doc.open`, MCP `open`, CLI `eval`/`run` | go through the same format detection in `solidcraft_io` |
| Browser file picker | `apps/solidcraft-web/src/files.rs` (`accept`) |
| Windows | `packaging/windows/solidcraft.wxs`: the `.solvecraft` extension on the design ProgId and in `SupportedTypes` |
| macOS | `packaging/macos/Info.plist.in`: `solvecraft` in the design document type's extensions |
| Linux / FreeBSD / Flatpak | `packaging/linux/ai.storyteller.solvecraft.mime.xml`: `*.solvecraft` glob and the `application/x-solvecraft` alias |
Recent-files entries that point at a `.solvecraft` file keep working: they are plain paths and
open through the same detection. The browser app also lists designs it stored under the old
extension, and keyboard-shortcut files exported as `solvecraft-shortcuts/1` still import
(`crates/ui-egui/src/toolbar_custom.rs`). Tests: `crates/io` (`Format::from_name`,
`is_design_path`), `legacy_extension_and_format_tag_still_open` (CLI, `run_results.rs`) and
`legacy_design_files_and_resource_uris` (MCP `open`).
## 2. The `solvecraft/N` format tag
Designs record their format as `"format": "solidcraft/N"`. Files saved by builds up to 0.5 say
`"format": "solvecraft/N"`; `crates/doc/src/format.rs` (`version_of`) reads both prefixes and
upgrades them as usual (the file is re-tagged `solidcraft/N` when saved).
Not backward-compatible: builds up to 0.5 don't know the new tag and refuse files saved by
later builds. Test: `version_of` accepts both prefixes; legacy-tagged designs load and are
re-tagged on save.
## 3. `SOLVECRAFT_*` environment variables
Every runtime variable is read through one helper, `solidcraft_geom::env` (`var`, `var_os`):
it reads `SOLIDCRAFT_<NAME>` and falls back to `SOLVECRAFT_<NAME>` when the new one is unset.
The shell entry points do the same: `packaging/linux/AppRun`
(`SOLIDCRAFT_NO_DESKTOP_INTEGRATION`) and `packaging/env.sh` (`SOLIDCRAFT_VERSION`,
`SOLIDCRAFT_BUILD_DATE`). Tests: the helper's unit tests (new wins, old is the fallback,
neither → unset).
## 4. Settings, preferences, autosave and recovery folders
New folders use the SolidCraft name:
| | Linux | macOS | Windows |
|---|---|---|---|
| `solvecraft-cli` alias binary: forwards every argument and stream to `solidcraft-cli`, prints a one-line deprecation note on stderr, exits with its status | `apps/solvecraft-cli/src/alias.rs`; shipped by every package (deb, rpm, tar.gz, AppImage, Flatpak, FreeBSD, MSI, portable zip, macOS CLI zip, Nix) | scripts and MCP client setups (`claude mcp add solvecraft -- solvecraft-cli mcp`) keep working for at least one release | `apps/solvecraft-cli/tests/legacy_alias.rs`; release workflow checks the deb contents |
| Linux app ID `ai.storyteller.solvecraft` (Flatpak ID, desktop entry, metainfo, MIME and icon file names, Wayland app_id) | `packaging/env.sh` (`APP_ID`), `packaging/linux/*`, the app's `with_app_id` | a new Flatpak ID would be a different app: installed Flatpaks would never update. The desktop entry, metainfo and Wayland app_id must equal the Flatpak ID | packaging-lint workflow; Flatpak smoke test |
| MSI `UpgradeCode` `6A145FD6-D285-428D-AE84-A69570CDF4DB` (a GUID, no name in it) | `packaging/windows/solidcraft.wxs` | the new MSI upgrades an existing install in place. The install folder moves to `Program Files\SolidCraft` (registry `Software\SolidCraft`); a custom folder chosen for an earlier version is not carried over this once | release workflow (MSI build) |
| deb `Replaces`/`Conflicts`/`Provides: solvecraft`, rpm `Obsoletes`/`Provides: solvecraft` | `packaging/linux/nfpm.yaml` | installing the `solidcraft` package replaces the old `solvecraft` one instead of clashing with its files | release workflow checks the deb fields |
| A copy of each AppImage's `.zsync` under the old name `solvecraft-<ver>-linux-<arch>.AppImage.zsync` | `packaging/linux/package.sh` | earlier AppImages carry update information that looks for that name; the copy points at the new AppImage | release workflow |
| `solvecraft.flatpakrepo` next to `solidcraft.flatpakrepo` | `packaging/flatpak-site.sh` | links in earlier instructions keep working (existing remotes use the repository URL, which is unchanged) | Pages workflow |
| `.solvecraft` file associations (Windows ProgId extension, macOS document type, freedesktop MIME glob and `application/x-solvecraft` alias) | `packaging/windows/solidcraft.wxs`, `packaging/macos/Info.plist.in`, `packaging/linux/ai.storyteller.solvecraft.mime.xml` | existing design files keep opening in SolidCraft from the file manager | packaging-lint workflow |
| `SOLVECRAFT_VERSION`, `SOLVECRAFT_BUILD_DATE`, `SOLVECRAFT_MAINTAINER`, `SOLVECRAFT_NO_DESKTOP_INTEGRATION` read when the `SOLIDCRAFT_*` name is unset | `packaging/env.sh`, `packaging/linux/package.sh`, `packaging/linux/AppRun` | build scripts and AppImage users' environments keep working | packaging tests |
| Preferences, graphics settings | `~/.local/share/solidcraft` | `~/Library/Application Support/SolidCraft` | `%APPDATA%\SolidCraft\data` |
| Recovery (autosave) | `…/solidcraft/recovery` | `…/SolidCraft/recovery` | `%LOCALAPPDATA%\SolidCraft\recovery` |
## Not kept
On first launch, if the new folder doesn't exist but the old one (`solvecraft` / `SolveCraft`)
does, it is **copied** to the new location; the old folder is never deleted or changed. The
window and UI state that eframe kept under `ai.storyteller.solvecraft` is copied the same way.
Autosaves copied from the old folder (`<id>.solvecraft`) are listed and recovered like new ones.
The preferences key in eframe's storage is `solidcraft.prefs`; `solvecraft.prefs` is read when
it is missing (desktop and browser, `solidcraft_ui_egui::prefs::stored`). The browser app also
reads files and the autosave it kept under the old names in local storage and OPFS
(`apps/solidcraft-web/src/files.rs`). A 3DxWare profile the driver made for the old executable
name is read until it makes a new one (`apps/solidcraft/src/space_mouse.rs`).
The thumbnail cache is not migrated; it is rebuilt. The copy helper is
`solidcraft_io::adopt_legacy_dir`, used by the desktop app (`adopt_legacy_settings`) and
`solidcraft_engine::recovery::default_dir`. Tests: `legacy_dir` (copy once, never overwrite,
old folder intact), `first_launch_adopts_the_previous_release_settings`,
`autosave_from_a_legacy_folder_is_listed_and_loads`, `recovery_dirs_and_their_legacy_names`,
`stored_prefs_fall_back_to_the_legacy_key`.
- The macOS bundle identifier is now `ai.storyteller.solidcraft`: apps are installed by dragging
from the DMG and there is no updater keyed on it. The first launch may ask again for Gatekeeper
approval.
- The GUI binary has no alias: every package's launcher, shortcut and file association runs
`solidcraft`.
## 5. `solvecraft-cli` alias
A tiny `solvecraft-cli` binary (`apps/solidcraft-cli/src/alias.rs`) ships in every package for
at least one release (since 0.5.0). It prints a one-line deprecation note to stderr and runs the
`solidcraft-cli` next to it with the same arguments, stdin/stdout and exit code, so scripts
and MCP client configs that call `solvecraft-cli` keep working. Test: `apps/solidcraft-cli/tests/legacy_alias.rs` (forwards `--version` and the exit status;
the note goes to stderr only, so stdout stays clean for MCP).
There is no alias for the desktop binary: launchers, file associations and Start-menu entries
installed by the packages point at `solidcraft`.
## 6. MCP
`serverInfo.name` is now `solidcraft`. The name a client shows is chosen by the user when the
server is added, so an existing setup such as
```sh
claude mcp add solvecraft -- solvecraft-cli mcp
```
keeps working (through the alias above). New setups use:
```sh
claude mcp add solidcraft -- solidcraft-cli mcp
```
Switch before the alias is removed. Resources are listed as `solidcraft://design` and
`solidcraft://commands`; the old `solvecraft://` URIs still read (`crates/mcp/src/server.rs`,
test `legacy_design_files_and_resource_uris`).
## Package IDs
| Package | Decision | Why |
|---|---|---|
| Flatpak app ID / Linux desktop ID `ai.storyteller.solvecraft` | **kept** | A new Flatpak ID is a different app: existing installs would stop receiving updates. The `.desktop`, metainfo and MIME file names and the Wayland `app_id` must match it, so they keep it too. |
| Flatpak remote file | `solidcraft.flatpakrepo`, plus a legacy `solvecraft.flatpakrepo` copy | Old links keep working; existing remotes point at the repo URL, which is unchanged. |
| macOS bundle ID | changed to `ai.storyteller.solidcraft` | No updater depends on it; the app is drag-installed. macOS may ask again on first launch (unsigned builds). |
| MSI `UpgradeCode` | **kept** | So the new MSI upgrades the old install in place. Product name is SolidCraft; the default folder becomes `Program Files\SolidCraft` (the major upgrade removes the old folder). A custom install folder isn't remembered across this one upgrade. |
| deb / rpm package name | renamed to `solidcraft`; deb `Replaces`/`Conflicts`/`Provides: solvecraft`, rpm `Obsoletes`/`Provides: solvecraft` | Installing the new package replaces the old one instead of installing side by side. |
| AppImage | `solidcraft-<version>-linux-<arch>.AppImage`; the release also carries a copy of its `.zsync` under the old `solvecraft-…` name | AppImages already installed look for the old-named `.zsync`, so AppImageUpdate keeps finding updates. |
## macOS
Releases before 0.4 were installed as `SolveCraft.app`. To update, quit the app, drag
`SolidCraft.app` from the DMG onto Applications, move `SolveCraft.app` to the Trash, and
replace any Dock shortcut with the old name (open `SolidCraft.app`, then
**Options > Keep in Dock**). Designs and settings are kept (see 4).
## Flatpak remotes added from the former website address
`flatpak remote-modify --user --url=https://bherbruck.github.io/solidcraft/flatpak/repo/ solvecraft`
(use your remote's name), then `flatpak update --user`.
+3 -3
View File
@@ -1,6 +1,6 @@
# Control protocol
`solvecraft --control PORT` (or `SOLVECRAFT_CONTROL_PORT=PORT`) listens on `127.0.0.1:PORT` for
`solidcraft --control PORT` (or `SOLIDCRAFT_CONTROL_PORT=PORT`) listens on `127.0.0.1:PORT` for
JSON lines. Each request is one line `{"id": …, "method": "…", "params": {…}}`; each reply is one
line `{"id": …, "ok": true, "result": …}` or `{"id": …, "ok": false, "error": "…"}`. Requests are
handled on the UI thread between frames; pointer and keyboard input is injected as real egui
@@ -23,7 +23,7 @@ answered within 60 seconds is replied to with `{"ok": false, "error": "timeout"}
| `engine.commands` | — | every command: id, label, tab, panel, icon, shortcut, params doc, enabled |
| `document.inspect` | `measure?`: bool | parameters, timeline (errors, timings), bodies, sketches, selection |
Commands never open dialogs when run this way. `solvecraft-cli commands` prints the same registry.
Commands never open dialogs when run this way. `solidcraft-cli commands` prints the same registry.
Every `sketch.*` command that changes a sketch adds `created: {points, curves, constraints,
dimensions}` to its result (and `wires` for 3D curves): the ids of what it added, in creation
@@ -85,7 +85,7 @@ unit regardless of the design, pass an expression with one: `"value": "50 mm"` o
## MCP
`solvecraft-cli mcp --connect 127.0.0.1:PORT` bridges an MCP client (an AI agent) to this
`solidcraft-cli mcp --connect 127.0.0.1:PORT` bridges an MCP client (an AI agent) to this
channel; see [mcp.md](mcp.md).
## Example
+9 -9
View File
@@ -8,15 +8,15 @@ until you review and submit it, and the design is not part of the draft.
## Where they are
`<data dir>/solvecraft/crashes/`, next to the recovery folder:
`<data dir>/solidcraft/crashes/`, next to the recovery folder:
| System | Folder |
|---|---|
| Linux | `~/.local/share/solvecraft/crashes` (or `$XDG_DATA_HOME/solvecraft/crashes`) |
| Windows | `%LOCALAPPDATA%\SolveCraft\crashes` |
| macOS | `~/Library/Application Support/SolveCraft/crashes` |
| Linux | `~/.local/share/solidcraft/crashes` (or `$XDG_DATA_HOME/solidcraft/crashes`) |
| Windows | `%LOCALAPPDATA%\SolidCraft\crashes` |
| macOS | `~/Library/Application Support/SolidCraft/crashes` |
`SOLVECRAFT_CRASH_DIR` overrides the folder. `solvecraft --crash-log` and
`SOLIDCRAFT_CRASH_DIR` overrides the folder. `solidcraft --crash-log` and
`solidcraft-cli crashes dir` print it.
## For agents
@@ -32,10 +32,10 @@ All of these read the same folder:
**Reproduce:** `solidcraft-cli crashes replay <id>` opens the report's design, runs its
commands, and reports whether the same internal error happens again (same place and message).
Without the CLI, run `solidcraft-cli run <report>/replay.json --in <report>/design.solvecraft`.
Without the CLI, run `solidcraft-cli run <report>/replay.json --in <report>/design.solidcraft`.
A fixed crash turns into a regression test with the same two files.
**Check that reporting works:** with `SOLVECRAFT_CRASH_TEST=1` set for the app, the command
**Check that reporting works:** with `SOLIDCRAFT_CRASH_TEST=1` set for the app, the command
`diagnostics.crash_test` has three modes:
- `panic`: an internal error in a command
- `kernel`: an internal error inside the geometry kernel
@@ -45,7 +45,7 @@ A fixed crash turns into a regression test with the same two files.
A folder `crashes/<YYYYMMDD-HHMMSS>-<signature>/`:
- `report.json` (`"format": "solvecraft-crash/1"`):
- `report.json` (`"format": "solidcraft-crash/1"`):
- `kind`: one of
- `command_panic`: a command hit an internal error; it was caught and the design was left unchanged
- `kernel_panic_recovered`: the third-party geometry kernel panicked and was caught. This is harmless on the desktop, but it would crash the web build.
@@ -59,7 +59,7 @@ A folder `crashes/<YYYYMMDD-HHMMSS>-<signature>/`:
- `base`: what the replay starts from (the design before the command, an autosave, a saved file or a new design)
- `count`, `first_seen`, `last_seen`: the same crash repeats only increase `count`
- `notes`: what is missing and why, for example a design too large to copy
- `design.solvecraft`: the design the replay starts from
- `design.solidcraft`: the design the replay starts from
- `replay.json`: `{"commands": [{command, params}, …]}`
## How it stays cheap and small
+1 -1
View File
@@ -1,6 +1,6 @@
# Features
SolidCraft's commands by area, generated by `cargo xtask features` from the command registry (`solvecraft-cli commands`). **314 commands.** Every command runs the same way from the toolbar, a script, `solvecraft-cli exec <id> '<json>'`, the control channel and MCP; parameters are in the [command reference](book/src/reference/commands.md) (`cargo xtask book`). Status and plans: [ROADMAP](../ROADMAP.md).
SolidCraft's commands by area, generated by `cargo xtask features` from the command registry (`solidcraft-cli commands`). **314 commands.** Every command runs the same way from the toolbar, a script, `solidcraft-cli exec <id> '<json>'`, the control channel and MCP; parameters are in the [command reference](book/src/reference/commands.md) (`cargo xtask book`). Status and plans: [ROADMAP](../ROADMAP.md).
## Sketch (97)
+1 -1
View File
@@ -35,7 +35,7 @@ The desktop host tries system CJK fonts across Windows, macOS and Linux, as well
in native desktop distribution packages; native builds rely entirely on existing operating system fonts
or craft-fonts.
In the browser, `solvecraft-web` bundles a self-hosted Japanese font (`BIZUDPGothic-Regular.ttf`, licensed
In the browser, `solidcraft-web` bundles a self-hosted Japanese font (`BIZUDPGothic-Regular.ttf`, licensed
under SIL OFL 1.1) within the web distribution artifacts only. The font is loaded asynchronously from the same
origin (`./fonts/BIZUDPGothic-Regular.ttf`) on-demand when the interface language is set to Japanese, without
contacting any external CDNs or third-party servers. For users with an English interface, no font download
+12 -11
View File
@@ -9,14 +9,14 @@ toolbar, palette, scripts and control channel use, and never opens a dialog.
```sh
# Headless: an in-process design session, no window (CPU renders for screenshots).
solvecraft-cli mcp
solidcraft-cli mcp
# Headless, starting from a design file or a command script.
solvecraft-cli mcp --in part.solvecraft
solidcraft-cli mcp --in part.solidcraft
# Bridged to the running app, so you can watch the agent model:
solvecraft --control 7878 &
solvecraft-cli mcp --connect 127.0.0.1:7878
solidcraft --control 7878 &
solidcraft-cli mcp --connect 127.0.0.1:7878
```
stdout carries only protocol messages; errors go to stderr. Bridged screenshots are written to a
@@ -24,12 +24,13 @@ temporary file by the app and read back by the server, so both must run on the s
### Client configuration
Claude Code (project `.mcp.json`, or `claude mcp add solvecraft -- solvecraft-cli mcp`):
Claude Code (project `.mcp.json`, or `claude mcp add solidcraft -- solidcraft-cli mcp`; a setup
added under the previous name keeps working, see the [compatibility notes](https://github.com/bherbruck/solidcraft/blob/main/docs/compatibility.md#mcp)):
```json
{
"mcpServers": {
"solvecraft": { "command": "solvecraft-cli", "args": ["mcp"] }
"solidcraft": { "command": "solidcraft-cli", "args": ["mcp"] }
}
}
```
@@ -39,7 +40,7 @@ Claude Desktop (`claude_desktop_config.json`), bridged to a running app:
```json
{
"mcpServers": {
"solvecraft": { "command": "/path/to/solvecraft-cli", "args": ["mcp", "--connect", "127.0.0.1:7878"] }
"solidcraft": { "command": "/path/to/solidcraft-cli", "args": ["mcp", "--connect", "127.0.0.1:7878"] }
}
}
```
@@ -60,7 +61,7 @@ Claude Desktop (`claude_desktop_config.json`), bridged to a running app:
| `undo`, `redo` | — | Undo / redo one change. |
| `crash_reports` | `id?`, `limit?` | The crash reports on this computer, newest first; with `id`, the whole report (backtrace, command, recent commands, `design_path`/`replay_path`). See [crash-reports.md](crash-reports.md). |
| `new_design` | `name?` | Start an empty design. |
| `open` | `path` | Open a `.solvecraft` design, a STEP file (`.step`/`.stp`) as a new design holding its bodies (an Import base feature), or a 3MF/STL file as mesh bodies. |
| `open` | `path` | Open a `.solidcraft` design, a STEP file (`.step`/`.stp`) as a new design holding its bodies (an Import base feature), or a 3MF/STL file as mesh bodies. |
| `save` | `path?` | Save the design (to its current file without `path`). |
To change a feature after it is made, read its definition with `execute` `timeline.inspect`
@@ -68,7 +69,7 @@ To change a feature after it is made, read its definition with `execute` `timeli
`{"extent": {"distance": "30"}}`). The fields per feature type are listed in the book's
*Solid features* chapter.
Resources: `solvecraft://design` (inspect JSON with measurements) and `solvecraft://commands`
Resources: `solidcraft://design` (inspect JSON with measurements) and `solidcraft://commands`
(the catalog).
Errors: an unknown tool or arguments that don't match the tool's schema are JSON-RPC
@@ -83,8 +84,8 @@ the batch added to the undo history.)
## Demo: an enclosure built over MCP
`examples/demo/enclosure_mcp.py` is a small MCP client. It drives a running app (`solvecraft
--control PORT`) through `solvecraft-cli mcp --connect` and builds an electronics enclosure one
`examples/demo/enclosure_mcp.py` is a small MCP client. It drives a running app (`solidcraft
--control PORT`) through `solidcraft-cli mcp --connect` and builds an electronics enclosure one
`execute` call at a time (`enclosure_steps.json`): a rounded box, shelled open at the top, a
USB port cut through a side wall, four screw bosses, and then a change of the `width`
parameter that the timeline rebuilds. `examples/demo/record.sh` records the run with ffmpeg,
+11 -11
View File
@@ -14,7 +14,7 @@ nix run github:bherbruck/solidcraft#solidcraft -- --sample
```
Inside a checkout, `nix run .` and `nix run .#solidcraft` launch the desktop app.
`nix run .#cli -- --version` launches the CLI. The legacy `.#solvecraft` app name
`nix run .#cli -- --version` launches the CLI. The legacy `.#solidcraft` app name
also works. These commands use the flake's exact wrapped binary, rather than an
older executable already on your shell's `PATH`.
@@ -26,8 +26,8 @@ nix build github:bherbruck/solidcraft#solidcraft
./result/bin/solidcraft --sample
```
The result contains `solidcraft`, the compatible `solvecraft` binary name, and
`solvecraft-cli`. **Building does not install a desktop-menu entry.** For a user
The result contains `solidcraft`, `solidcraft-cli` and the deprecated old-name CLI alias
(see [compatibility.md](compatibility.md)). **Building does not install a desktop-menu entry.** For a user
profile installation, run:
```sh
@@ -41,19 +41,19 @@ sizes alongside the commands. On macOS the package contains the binaries only; f
`packages.${system}.solidcraft` in `environment.systemPackages`/`home.packages`.
If a non-NixOS desktop does not discover profile-installed launchers, ensure that
its session includes `~/.nix-profile/share` in `XDG_DATA_DIRS`, then log out and
back in. The existing `ai.storyteller.solvecraft` desktop/application ID and
`.solvecraft` design files remain compatible.
back in. The desktop/application ID is unchanged (see
[compatibility.md](compatibility.md#package-ids)).
Check which executable a plain terminal command would run:
```sh
type -a solidcraft solvecraft
type -a solidcraft
readlink -f "$(command -v solidcraft)"
solidcraft --version
nix run github:bherbruck/solidcraft#solidcraft -- --version
```
An unrelated old `solvecraft` executable on `PATH` is not updated by `nix build`.
An unrelated old executable on `PATH` is not updated by `nix build`.
Use the flake app or `./result/bin/solidcraft` to verify the package you just built.
## Graphics and file dialogs
@@ -85,7 +85,7 @@ OpenGL rendering uses 1x anti-aliasing to avoid the multisampled black-frame fai
Vulkan and other backends keep the requested sample count; saved preferences are preserved.
For older builds, including 0.3.0, set Anti-aliasing to 1x and restart when using OpenGL.
If that window cannot show the settings dialog, edit only the `msaa` field to `1` in
`~/.local/share/solvecraft/graphics.json`; preserve any other settings.
`~/.local/share/solidcraft/graphics.json`; preserve any other settings.
## Wayland, XWayland and niri
@@ -97,12 +97,12 @@ under niri's XWayland. The trade-off: **on native Wayland, dropping files onto t
window does not work**; use File > Open or pass the file on the command line.
This applies to every build, not only the Nix package.
Override the choice with `SOLVECRAFT_WAYLAND=1` (always native Wayland) or
`SOLVECRAFT_WAYLAND=0` (XWayland whenever an X display is available).
Override the choice with `SOLIDCRAFT_WAYLAND=1` (always native Wayland) or
`SOLIDCRAFT_WAYLAND=0` (XWayland whenever an X display is available).
## Development shells
`nix develop` supplies runtime libraries and uses the Rust/C toolchain already on
your `PATH`. `nix develop .#rust` supplies the pinned toolchain, C linker and
`target/nix` build directory. Both retain the GUI and CLI's existing Cargo package
names (`solvecraft`, `solvecraft-cli`).
names (`solidcraft`, `solidcraft-cli`).
+14 -14
View File
@@ -39,14 +39,14 @@ Cross-part scheduling, parallel B-rep reconstruction and later display meshes re
Reproduce after compiling, without other builds running:
```sh
cargo test -p solvecraft-kernel --profile ci benchmark_independent_step_solids --no-run
SOLVECRAFT_STEP_BENCH_COUNT=512 SOLVECRAFT_STEP_BENCH_KIND=cylinder \
cargo test -p solvecraft-kernel --profile ci benchmark_independent_step_solids \
cargo test -p solidcraft-kernel --profile ci benchmark_independent_step_solids --no-run
SOLIDCRAFT_STEP_BENCH_COUNT=512 SOLIDCRAFT_STEP_BENCH_KIND=cylinder \
cargo test -p solidcraft-kernel --profile ci benchmark_independent_step_solids \
-- --ignored --nocapture --test-threads=1
```
Use `torus` or `box` for the other fixtures and repeat in three fresh processes.
`SOLVECRAFT_STEP_BENCH_FIXTURE` optionally writes the original STEP for native inspection.
`SOLIDCRAFT_STEP_BENCH_FIXTURE` optionally writes the original STEP for native inspection.
No timing threshold runs in CI. Regressions compare serial and threaded imports with
different worker counts: exact display meshes, measures, body/face source identities,
names, colours/opacity, units, rotated assembly placements, duplicates and partial failures
@@ -64,7 +64,7 @@ across edits.
The reproducible microbenchmark is:
```sh
cargo test -p solvecraft-doc --profile ci benchmark_prepared_extrude_sources -- --ignored --nocapture
cargo test -p solidcraft-doc --profile ci benchmark_prepared_extrude_sources -- --ignored --nocapture
```
Three Windows x64 optimized `ci` runs, during other compilation, compared the previous
@@ -89,9 +89,9 @@ straight-line projection and exact surface-refinement reuse changes:
| Local Pi case assembly, 25 features, 2,990 bodies | 14.75 s | 11.57 s | 21.6% |
These are geometry rebuild times, not complete desktop opening times. The public fixture
can be generated with `solvecraft-cli run examples/acceptance/sensor_enclosure.json
--save sensor.solvecraft --quiet`, then measured with `solvecraft-cli bench-open
sensor.solvecraft`. Each benchmark starts a new process; this does not measure a warm
can be generated with `solidcraft-cli run examples/acceptance/sensor_enclosure.json
--save sensor.solidcraft --quiet`, then measured with `solidcraft-cli bench-open
sensor.solidcraft`. Each benchmark starts a new process; this does not measure a warm
timeline-cache hit. The local assembly is private and is not part of the repository.
Straight segments now use guarded algebraic closest-point projection instead of sampling
@@ -109,7 +109,7 @@ Both saved fixtures retain exactly the same body names, face/edge/vertex/shell c
bounds, volumes, and surface areas. Focused tests compare cached and uncached refinement
coordinates and normals bit for bit on periodic, singular and transformed surfaces.
For desktop phase profiling, set `SOLVECRAFT_PROFILE_OPEN=1` before launching the app.
For desktop phase profiling, set `SOLIDCRAFT_PROFILE_OPEN=1` before launching the app.
Interactive Open reports geometry, placement, tessellation, thumbnail and total worker
times to stderr without logging the source path. Thumbnails were about 0.1 seconds of
the slow assembly's open and were not the main bottleneck. Further cold Boolean and
@@ -132,7 +132,7 @@ ready: 13.04 s geometry, 2.20 s placement, 0.53 s meshing and 0.07 s thumbnails.
the optimized `ci` profile and actual Vulkan rendering, with isolated settings and caches.
Linux and Windows timings are separate measurements and must not be compared as a speedup.
`solvecraft-cli bench-open design.solvecraft` reports JSON lines for file reading,
`solidcraft-cli bench-open design.solidcraft` reports JSON lines for file reading,
JSON decoding and migrations (including input-name repair), timeline evaluation, individual
features, and world placement/display meshing. `--parse-only` stops before geometry evaluation.
The parse timer includes document validation and repair, not just the JSON parser.
@@ -205,7 +205,7 @@ every row's place.
# Recompute performance
`solvecraft-cli bench-edit <script> <param> "(<old>) * 1.02"` builds a design from its script
`solidcraft-cli bench-edit <script> <param> "(<old>) * 1.02"` builds a design from its script
(timing the build), then times a parameter edit, setting the parameter back to its old
expression, undo and redo. Each cell is before → after the evaluation cache, with the number of
features recomputed in parentheses. Release build, on a machine shared with other build jobs (load average about 45; the
@@ -268,7 +268,7 @@ Pi case in 15.2 s and 10.5 s. During those jobs, median `ui.inspect` round trips
and 8.3 ms; the slowest were 33.7 ms and 28.6 ms. This fixes the window freeze, not the
remaining cost of cold geometry evaluation.
Recent thumbnails are 240 × 150 PNG files in `SolveCraft/thumbnails` under the platform
Recent thumbnails are 240 × 150 PNG files in `SolidCraft/thumbnails` under the platform
cache directory (`LOCALAPPDATA` on Windows). Their keys include the source path, file size
and modification time. Open and Save render from the model already in memory. Cached
recents decode the PNG without reading or rebuilding a document, and run before cold
@@ -277,7 +277,7 @@ No thumbnail or base64 image is added to the design JSON. A regression test veri
source bytes remain unchanged, a cached picture works even without a parseable source
file, and changing the source invalidates the cache.
`solvecraft-cli bench-open` also accepts STEP/IGES. For exchange files its `parse` phase
`solidcraft-cli bench-open` also accepts STEP/IGES. For exchange files its `parse` phase
includes constructing and checking the imported B-rep, not merely decoding STEP syntax.
The live test loaded both cached recent cards in 21 ms and inserted the 2 MB lightweight
@@ -299,7 +299,7 @@ drag's steps are a quarter of the smallest held size instead of an eighth, excep
ran out of budget: the rest of that drag goes in eighths, as before, and continuation keeps
the branch the seed no longer places.
`cargo run --release -p solvecraft-sketch --example solve_bench`, macOS arm64, load average
`cargo run --release -p solidcraft-sketch --example solve_bench`, macOS arm64, load average
45–75 (best of 5):
| Grid (origin corner fixed, rows horizontal, columns vertical, every edge a distance) | Start | Before | After |
+7 -9
View File
@@ -6,16 +6,14 @@ GitHub Release. Publishing that verified draft is a separate operation. Pushing
pushing a tag does not start the release workflow. There is no automatic commit-message-based
version bump and no patch release for every merge.
## Compatibility names and deployment
## Names and deployment
SolidCraft is the product display name. Keep existing release asset filenames, including
`SolveCraft-{version}-windows-x64.exe` and `solvecraft-cli` archives, together
with installed package IDs and settings paths. The macOS DMG now contains `SolidCraft.app`
with a `SolidCraft` bundle executable and icon; its bundle ID remains
`ai.storyteller.solvecraft`. Include the one-time macOS upgrade instructions from
`.github/release-notes.md` so users replace an existing `SolveCraft.app` rather than
installing a second copy. Do not rewrite published 0.2.0 or 0.2.1 assets,
checksums, tags or historical release notes.
Every release asset, binary, installer product name and package uses the SolidCraft name
(`solidcraft-<version>-linux-<arch>.AppImage`, `SolidCraft-<version>-windows-x64.exe`,
`solidcraft-cli` archives, …). The old name survives only in the shims listed in
[compatibility.md](compatibility.md) (the Linux app ID, the legacy `.zsync` and `.flatpakrepo`
copies, the deprecated old-name CLI alias); keep them until that document says they can go. Do not
rewrite published assets, checksums, tags or historical release notes of earlier versions.
Project Pages publishes the documentation, browser app and published-release Flatpak
repository under `/solidcraft/`. Do not add a separate owner-site publisher or permanent
+2 -2
View File
@@ -7,8 +7,8 @@ robustness runs build random but realistic designs and check every step.
## How it runs
```
solvecraft-cli fuzz --from 0 --count 1000 --jobs 8 --timeout 90 --out runs/ --report report.md
solvecraft-cli fuzz-one <seed> --minimise # one design, cut down to the steps that matter
solidcraft-cli fuzz --from 0 --count 1000 --jobs 8 --timeout 90 --out runs/ --report report.md
solidcraft-cli fuzz-one <seed> --minimise # one design, cut down to the steps that matter
```
`--count` seeds are run starting at `--from`. A range that exceeds `u64::MAX` is
+1 -1
View File
@@ -2,7 +2,7 @@
SolidCraft reads STEP (ISO 10303-21; AP203, AP214 and AP242 geometry) with its own reader in `crates/kernel/src/step_in` (written from the public standards; no third-party STEP code). A STEP file becomes an **Import** base feature on the timeline: it holds the file's B-rep (the STEP text is kept in the design, so the design reopens without the file) and later features — fillets, holes, cuts sketched on its faces, shells — build on its bodies.
- **Open**: File → Open (`doc.open`) accepts `.step`/`.stp` in any case and starts a new design; `solvecraft part.step`; `solvecraft-cli eval part.step`, `solvecraft-cli run script.json --in part.step`; the MCP `open` tool.
- **Open**: File → Open (`doc.open`) accepts `.step`/`.stp` in any case and starts a new design; `solidcraft part.step`; `solidcraft-cli eval part.step`, `solidcraft-cli run script.json --in part.step`; the MCP `open` tool.
- **Insert** into the current design: File → Insert STEP… or SOLID → INSERT (`file.insert_step {path}`).
- **Drag and drop** a STEP file on the window: inserted when the design has features, opened otherwise.
+7 -7
View File
@@ -5,13 +5,13 @@ dotted ids and reconciled with the current implementation.
| Branches | Result |
|---|---|
| `solvecraft-sk`, `solvecraft-d2` | Ported `62d22e2` and `e0b3138`: sketches/projections see placed components; cache keys include placements; moved feature dialogs resolve world picks; Joints uses Browser rows. |
| `solvecraft-b4` | Ported `2c18dac`: canvases carry component ownership and named joint origins follow component placements. |
| `solvecraft-asm` | Ported `bc05805`: joint snap feedback, Drive limits, joint menus, and Motion Study editing/playback controls. |
| `solvecraft-shell`, `solvecraft-shell-b` | Browser chevrons, shared occurrence Move triad, toolbar customization, workspace switcher and status labels are already present on main. Their scenarios remain active; the Joints chevron scenario is now active too. |
| `solvecraft-kdev3`, `solvecraft-kdev`, `solvecraft-kdev2` | Previously landed as `67c79ec`; the old refs were already removed. |
| `solvecraft-kdev4` | The earlier robustness, shell, blends, wasm and measurement work is already present. Ported the remaining `9f98449` stacked-prism sewing and repaired curved-boundary face picking. |
| `solvecraft-params(-build)` | Previously landed as `517b7a9`. |
| `solidcraft-sk`, `solidcraft-d2` | Ported `62d22e2` and `e0b3138`: sketches/projections see placed components; cache keys include placements; moved feature dialogs resolve world picks; Joints uses Browser rows. |
| `solidcraft-b4` | Ported `2c18dac`: canvases carry component ownership and named joint origins follow component placements. |
| `solidcraft-asm` | Ported `bc05805`: joint snap feedback, Drive limits, joint menus, and Motion Study editing/playback controls. |
| `solidcraft-shell`, `solidcraft-shell-b` | Browser chevrons, shared occurrence Move triad, toolbar customization, workspace switcher and status labels are already present on main. Their scenarios remain active; the Joints chevron scenario is now active too. |
| `solidcraft-kdev3`, `solidcraft-kdev`, `solidcraft-kdev2` | Previously landed as `67c79ec`; the old refs were already removed. |
| `solidcraft-kdev4` | The earlier robustness, shell, blends, wasm and measurement work is already present. Ported the remaining `9f98449` stacked-prism sewing and repaired curved-boundary face picking. |
| `solidcraft-params(-build)` | Previously landed as `517b7a9`. |
The source WIP refs are retained until this batch merges. Delete them only after the merged
main contains the reconciled changes and passes CI.