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

+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`.