Real root cause:
Tailwind v4's lightningcss is invoked from a Turbopack-bundled postcss.js at
runtime. Turbopack resolves require() against the workspace's TOP-LEVEL
node_modules, not against bun's nested .bun/ store. So even when
lightningcss-darwin-arm64 is correctly installed inside .bun/ with proper
symlinks, Turbopack can't see it — and lightningcss falls back to a sibling
'.node' file which doesn't exist, hence the runtime error.
Private-editor accidentally works because it has TWO lightningcss versions
(1.27.0 from Expo + 1.32.0 from Tailwind), which forces bun's hoisting
algorithm to put one copy at the top level. Editor-v2 has only one version,
so bun keeps it nested in .bun/ and nothing is at top-level.
Fix: declare the platform binary packages as optionalDependencies at the
WORKSPACE ROOT (not apps/editor). Root deps are always hoisted to top-level
node_modules, so Turbopack's resolver finds them. Bun still applies the
os/cpu filter at install time, so each developer only ends up with their
host's binaries on disk.
Verified on Linux: node_modules/lightningcss-linux-arm64-gnu is a top-level
symlink after install. On macOS, the darwin variants will be hoisted instead.
Wholesale swap of packages/{core,viewer,editor,mcp} and apps/editor with the
versions from the private editor repo, which is the production source of truth.
Setup changes:
- packages/{core,viewer,editor} versions held at 0.7.0 baseline (matching
the most recent published release) so a bump=minor publishes 0.8.0
- packages/mcp held at 0.1.1 (never published; first publish will go through
the new release.yml flow)
- peerDependencies and devDependencies for inter-package @pascal-app/*
references pinned to ^0.7.0 instead of '*' / 'workspace:*' so they are
valid for npm consumers
- Root package.json: TypeScript bumped to 6.0.2, added overrides for
@types/react, @types/react-dom, @types/three to prevent JSX namespace
fragmentation across the workspace
- release.yml extended to also publish editor and mcp; 'both' option renamed
to 'all'; added a sync step that updates inter-package peerDeps/devDeps to
match the new versions on every bump (so viewer/editor/mcp tarballs always
reference the version of core they were built against)
- Root scripts gained release:editor and release:mcp shortcuts
Verification:
- bun install --frozen-lockfile is consistent
- packages/{core,viewer,mcp} build cleanly, dist/index.d.ts emitted
- packages/editor check-types reports 21 pre-existing errors, identical to
what private-editor currently reports
Open PRs against editor-v2 will need rebasing/conflict resolution.
- Replace runtime mesh-based bounding-box computation with static dimension-based polygons for item footprints
- Add snapUpToGridStep() and getGridAlignedDimensions() to placement-math for grid-cell-aligned placement wireframes
- Add expandBoundsToGrid() to use-placement-coordinator for consistent wireframe snapping
- Add currentCursorRotationY to PlacementContext; preserve world orientation across item-surface transitions
- Fix item detach from surface: use worldToBuildingLocal() instead of event.localPosition to avoid coordinate-space jump
- Subscribe to useLiveTransforms in FloorplanPanel during placement so R/T keyboard rotation refreshes the 2D overlay immediately
- Fix FloorplanItemImage rotation (+180° to account for top-down camera capture orientation)
- Simplify spatial-grid-manager: single dimension-based getItemLocalBounds(), removes runtime mesh-metadata path
- Remove item-mesh-metadata system (compute-item-mesh-metadata, item-mesh-metadata-system, sync-request)