v0.9.5 — Windows Docker ESM, HEIC uploads, sandbox CSP, assertions-in-tests as error
Highlights
Windows Docker sandbox: end-to-end (#1982)
The ESM half of the #1946 / #1982 resolver gap. NODE_PATH is CJS-only per Node's spec, so 0.9.4 restored preset loading but left the MCP child's static ESM imports (import { readXPost } from "@mulmoclaude/x-plugin") failing on Windows. New server/agent/mcp-esm-loader.mjs + mcp-esm-bootstrap.mjs register a resolver hook via tsx --import that falls back to /app/pkg_modules/@mulmoclaude/* when default resolution fails.
The Windows CI probe (test/sandbox-repro/probe.ts) grew an ESM import() step, so this class of regression can't slip through again. No-op on Linux / macOS.
HEIC / HEIF / TIFF / BMP / AVIF attachments
- Uploader auto-converts these to JPEG server-side (#1996 via #1998).
- Pre-send preview chip decodes HEIC in the browser (#2000) so the confirmation thumbnail is legible.
User-extensible sandbox CSP (#1989)
Sandboxed collection views can whitelist third-party origins via workspace config/csp.json. A CSP-violation notice + boot-time warnings surface misconfigurations to the user instead of failing silently. Default remains locked down.
Remote host: offline queue for startChat (#1993)
Mobile companion's startChat requests hold while the host is offline; the host + @mulmoclaude/core layer replay them once the presence doc goes live. Presence doc now advertises host capabilities so mobile knows what's supported before submitting (#1992).
Lint: assertions-in-tests promoted warn → error
Three-batch cleanup (#1999 / #2001 / #2005) rewrote every flagged no-throw / side-effect-only test to wrap the target call in assert.doesNotThrow(...) / assert.doesNotReject(...). Includes a new real boundary test for deleteProjectSkill's user-scope refusal (was an empty placeholder before). Rule is now error in eslint.config.mjs — CI blocks a new assertion-less test.
Files: "Open in OS" button (#1988, closes #1985)
Binary / unsupported previews get an OS-native open button so the Files view isn't a dead end when MulmoClaude can't render inline.
Sandbox: allow file downloads from collection views (#1997)
Downloads no longer blocked by iframe sandbox flags.
Full Changelog
See CHANGELOG.md for the complete Added / Changed / Fixed / Security list.
📦 npm launcher: mulmoclaude@0.9.5 (2026-07-08)