v0.3.0 — the theme now restores itself
The theme now restores itself after a ZCode restart — and the launch entries get repaired, so the debug port is actually there to restore into.
Added
-
Recovery modes — the injected theme dies with the renderer on every restart, so you pick who puts it back:
on-start(default) — the MCP host ZCode spawns at startup restores it once. No resident process, no settings panel.always— registers an autostart entry for the residentservedaemon, so the theme and the settings panel survive a reboot. Costs a background node process (~60 MB, ~0.3% of one core).off— nothing automatic.
Switchable from the settings panel, or with the new
recovery_status/set_recovery_modetools. -
repair-launchers— scans desktop and Start Menu shortcuts, thezcode://protocol handler and the Explorer context-menu verbs, and appends the missing--remote-debugging-port. ZCode cannot open the port on its own: the flag has to come from whatever launches it, and a machine usually has several launch entries with only some carrying it. Machine-wide entries need administrator rights and are reported rather than skipped silently. -
The settings panel now reports when ZCode is running with its debug port closed — the one case no background process can fix — and offers a button that restarts the app properly.
Fixed
- The CLI and the plugin host wrote two different
config.jsonfiles, underplugins/data/zcode-beautify/and the…@zcode-beautifyform respectively, so settings changed through one path were invisible to the other. They now resolve to the same directory. - The local control API answered any request that could reach localhost, including from web pages open in a local browser, and could replace the wallpaper or reset the appearance. It now requires a token that only the injected panel carries.
holdSessionleaked its WebSocket when a step after the connect failed, and held sessions were never dropped while CDP was unreachable. Both accumulated connections over long runs.- The MCP server reported a hard-coded version that had drifted from the manifest; it is now injected at bundle time from
package.json.
Full details in CHANGELOG.md.