Release 1.9.0 - #130
Conversation
Moves [Unreleased] under a dated 1.9.0 heading with the classification rationale, per RELEASING.md step 2. package.json was already at 1.9.0. Classified minor. The trigger is the shared-internals change — core no longer imports next/* at runtime, and the build emits foundations' SCSS/CSS into dist as deprecated compat entries. RELEASING.md puts that class in a minor so it shows up in release notes rather than being buried in a patch. Corrects two lines that described @once-ui-system/foundations as something consumers can adopt today. It is not published to npm and is not a dependency of this release — the packaging fix made core self-contained — so release notes now say that plainly rather than implying an install path that does not exist. Verification (RELEASING.md step 3): - typecheck clean, build clean, 124 tests passed across 12 files - ai/manifest.json and ai/spec.json stamped 1.9.0, matching package version (AI-consumer rule; ai-manifest-sync.test.ts enforces it) - pnpm pack: 7 dependencies, no workspace-protocol or pre-release ranges - dependencies and peerDependencies compared against the published 1.8.3: byte-identical, so consumers install the same set they do today Not in this commit, and deliberately: the 1.9.0 entry for the docs changelog page, and the downstream notification RELEASING.md step 5 calls for. Both ride with the npm publish — landing them earlier would advertise a version that is not on the registry yet. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UsN93NU2Vp5axBdT3nLrZA
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
`pnpm dev` on a fresh clone failed with Module not found: Can't resolve '@once-ui-system/core/next' ./apps/docs/src/product/Providers.tsx apps/docs resolves @once-ui-system/core to the workspace package, whose exports map points into dist/. So core must be built before any app can resolve it — but the turbo `dev` task had no dependsOn, unlike `build` (^build), `test` (build) and `start` (build). The dependency graph confirmed it: @once-ui-system/docs#dev had zero dependencies. `dev` now dependsOn ^build. Persistent tasks may depend on non-persistent ones, so this builds dependencies once and then starts the dev server. The dev:core / dev:docs / dev:dev scripts also called pnpm --filter directly, bypassing turbo entirely, so they would have kept failing even with the graph fixed. They now route through turbo with the "..." dependency suffix, matching the build:docs / build:dev pattern already in use. Verified by wiping packages/core/dist entirely: the docs build then rebuilt foundations -> core -> docs, 3/3 tasks successful, with dist/next/index.js present. Reproduced the original error first by removing only dist/next, which produced the reported message byte for byte. Repo tooling only. Neither file is inside packages/core, so the published tarball is unchanged — confirmed by re-packing (0 matches for turbo.json). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UsN93NU2Vp5axBdT3nLrZA
|
Heads-up: It does not touch the published artifact. What it fixes:
Verified by wiping Happy to split it onto its own PR if you'd rather this one stay scoped to the changelog move — say the word and I'll move it. Generated by Claude Code |
`pnpm dev` failed on Node 21.7.1 with ERR_REQUIRE_ESM from inside Sass:
sass/sass.js:9 chokidar: require("chokidar")
require() of ES Module chokidar@5.0.0/index.js not supported
Nothing is mis-resolved. sass@1.102.0 declares chokidar ^5.0.0, and both
declare engines node >=20.19.0 — because 20.19.0 and 22.12.0 are exactly
the releases where require() of an ESM-only module landed. chokidar 5 is
ESM-only ("type": "module"), so Sass depends on that capability.
The repo declared engines.node ">=20.x", which 21.7.1 satisfies. The 21.x
line was retired before the require(ESM) backport, so it is the one range
that passes the check and still cannot build. Nothing warned, and the
failure surfaced as a stack trace inside Sass that names neither Node nor
the real constraint.
engines.node is now "^20.19.0 || >=22.12.0", verified against semver:
20.18.0 rejected, 20.19.0 ok, 21.7.1 rejected, 22.11.0 rejected,
22.12.0 ok, 24.0.0 ok. Adds .nvmrc (22) and a Requirements section in
CONTRIBUTING.md explaining why the floor is what it is, so the next
person reads a sentence instead of debugging Sass internals.
Left alone deliberately: engine-strict in .npmrc, which applies to every
transitive package's engines and can fail installs for unrelated reasons;
and packages/core's own engines field, which is consumer-facing and not
something to change inside a release PR.
Also adds packages/foundations to the monorepo structure table, which
still listed only core and the two apps after #129.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UsN93NU2Vp5axBdT3nLrZA
04ca501 set engines.node to "^20.19.0 || >=22.12.0". The 20.19 branch allowed a runtime that reached end of life on 2026-04-30 — verified against the node-releases schedule, not memory: v20 end 2026-04-30 (EOL) v21 end 2024-06-01 (EOL; why 21.7.1 lacks the require(ESM) backport) v22 end 2027-04-30 v24 end 2028-04-30 Vercel also stops building projects on Node 20 or older from 2026-10-01, so keeping 20.19 in the supported set would let a contributor develop on a version CI will refuse. engines.node is now ">=22.12.0" — still the require(ESM) floor Sass needs via chokidar 5, minus the dead branch. Verified against semver: 20.19.0 rejected, 21.7.1 rejected, 22.11.0 rejected, 22.12.0 ok, 24.x ok. .nvmrc stays at 22 (supported to 2027-04). CONTRIBUTING now gives both reasons for the floor separately, so the next person does not read the ESM explanation and assume 20.19 would be fine. Note this governs local development only. The Vercel warning is about per-project Node settings in the dashboard, which this repo cannot set — those 7 projects still need bumping before 2026-10-01. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UsN93NU2Vp5axBdT3nLrZA
The engines range in 04ca501/3d0669a only declares the requirement. pnpm does not enforce it by default, so running the build on Node 21 still produced ERR_REQUIRE_ESM from inside sass.js — a trace that names neither Node nor the constraint, and reads like a broken dependency rather than a local runtime problem. scripts/check-node.mjs prints the version it found, why the floor exists, and the commands to fix it, then exits 1. Wired at both points where it matters: root preinstall (setup) and foundations prebuild (the script that actually fails). Verified pnpm runs pre-scripts in this repo rather than assuming it — prebuild fires, and the full docs build chain is still 3/3 successful. Also corrects the CONTRIBUTING instructions, which were wrong on Windows: nvm-windows does not read .nvmrc, so `nvm use` alone does nothing there and the version has to be named. Both platforms now have their own block, plus a note that an already-open terminal keeps the old Node — which is the likeliest reason a build still reports the previous version after switching. Deliberately not engine-strict in .npmrc: pnpm applies that to every transitive package's engines, so it can fail installs for reasons unrelated to this one. An explicit check has no blast radius and a far better message. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UsN93NU2Vp5axBdT3nLrZA
Release proposal per RELEASING.md step 2. Moves
[Unreleased]under a dated1.9.0heading and states the classification rationale.package.jsonwas already at1.9.0from #129.Nothing is published by this PR. Per RELEASING.md step 4, releases are proposals until the maintainer runs
npm publish.Classification: minor
The trigger is the shared-internals change — core no longer imports
next/*at runtime, and the build emits foundations' SCSS/CSS intodistas deprecated compat entries. Both are intended as improvements that keep observable behavior identical, and RELEASING.md puts that class in a minor so it appears in release notes rather than being buried in a patch. Everything else is additive or internal.Consumers change nothing. No component, prop, export, token, or CSS class is removed or renamed; no type union narrows; no peer-dependency floor moves.
What's in the release
Added —
@once-ui-system/foundations(RFC Phase 1) and the package-contract/boundary test infrastructure (RFC Phase 0):check:package, exports integrity, framework-boundary guard, CSS API-surface and token snapshots, seed interaction tests.Changed — core no longer imports
next/*at runtime; Next.js users keep identical behavior through installed defaults.Fixed — the
ThemeInitReferenceErrorthat fired on every page load in every consumer app, and the packaging bug that would have madenpm installfail. Both are detailed in the changelog entry.One correction landed here
Two lines described
@once-ui-system/foundationsas a package consumers can adopt today. It is not published to npm and is not a dependency of this release — the packaging fix made core self-contained. The release notes now say that plainly rather than implying an install path that does not exist. Publishing foundations stays a separate decision on its own timeline; nothing in 1.9.0 depends on it happening.Verification (RELEASING.md step 3)
pnpm typecheck— cleanpnpm build— cleanpnpm test— 124 passed across 12 filesai/manifest.jsonandai/spec.jsonstamped1.9.0, matching the package version (the AI-consumer rule;ai-manifest-sync.test.tsenforces it)pnpm pack— 7 dependencies, no workspace-protocol or pre-release ranges in the tarballdependenciesandpeerDependenciesdiffed against the published1.8.3on npm: byte-identical, so consumers install the same set they do todayReach
^1.8.xresolves to this release, so theThemeInitfix reaches existing projects on their next install with no version bump. Checked across the fleet:magic,motionandmagic-convertare on^1.8.2,studioon^1.7.9— all satisfied by 1.9.0.Also in this branch — environment fixes, not release content
Two failures were reported on a fresh Windows clone while this PR was open. Fixing each surfaced the next.
9db0f57pnpm devnever built core, so every app failed to resolve@once-ui-system/core/next. The turbodevtask had nodependsOn— unlikebuild,testandstart— and@once-ui-system/docs#devhad zero dependencies in the task graph.devnow depends on^build, anddev:core/dev:docs/dev:devroute through turbo with...instead of bypassing it viapnpm --filter.04ca501ERR_REQUIRE_ESMfrom inside Sass. Nothing is mis-resolved:sass@1.102.0wantschokidar@^5, chokidar 5 is ESM-only, and Sassrequire()s it — which needs Node ≥22.12.0. The repo declared>=20.x, which 21.7.1 satisfies, so nothing warned. Adds.nvmrcand a CONTRIBUTING Requirements section.3d0669anode-releasesschedule) and which Vercel stops building from 2026-10-01. Tightened to>=22.12.0.450ec75enginesis only advisory — pnpm does not enforce it — so the Sass trace still appeared.scripts/check-node.mjsnow fails with the version found, why the floor exists, and platform-specific fix commands. Wired at rootpreinstalland foundationsprebuild; verified pnpm runs pre-scripts here rather than assuming. Also corrects the CONTRIBUTING instructions, which were wrong on Windows — nvm-windows does not read.nvmrc.Deliberately avoided:
engine-strict=truein.npmrc(pnpm applies it to every transitive package's engines, so it can fail installs for unrelated reasons), andpackages/core's ownenginesfield (consumer-facing, and not something to slip into a release PR).After the publish, not before
Two follow-ups deliberately excluded, because landing them earlier would advertise a version that is not on the registry yet:
apps/docs/src/resources/changelog.jsx).I'll do both once you've published — just say when.
🤖 Generated with Claude Code
https://claude.ai/code/session_01UsN93NU2Vp5axBdT3nLrZA