Releases are cut manually. There is no release bot, no Changesets, no semantic release. The convention is the contract.
Every PR that produces a user-visible change updates two changelogs under ## Unreleased:
- The affected component's
src/components/<name>/<name>.changelog.md. - The root
CHANGELOG.md, grouped under an### <component-name>subsection.
A PR that touches multiple components updates each component's changelog and adds one subsection per component in the root.
- Make sure
mainis clean, pulled, and CI is green. - Pick the bump:
patchfor bugfixes,minorfor additions,majorfor breaking changes. (Pre-1.0: breaking changes go in aminorbump.) - Edit
package.jsonand set the new version (do not runnpm version— it creates a tag from the pre-promotion commit; we want the promotion in the tagged commit). - In the root
CHANGELOG.md, rename## Unreleasedto## [X.Y.Z] - YYYY-MM-DD, keep its subsections, and add a fresh empty## Unreleasedabove it. - In every component changelog that had unreleased entries, do the same: promote
## Unreleasedto## [X.Y.Z] - YYYY-MM-DDand add a fresh<!-- ## Unreleased -->template above. - Run
npm installonce sopackage-lock.jsonpicks up the new version. - Commit:
git commit -am "release: vX.Y.Z". - Tag:
git tag vX.Y.Z. - Push:
git push --follow-tags.
The npm-publish.yml workflow fires on the v* tag, runs the tests, and publishes to npm.
If a publish fails post-tag, fix forward — bump to the next patch and release again. Do not unpublish from npm (it breaks consumers) and do not move tags.