Chai follows Semantic Versioning. Releases are tagged on main
as vMAJOR.MINOR.PATCH (for example v1.2.0).
It's three numbers, MAJOR.MINOR.PATCH, and the v is just a conventional prefix for the git tag:
v 1 . 2 . 0
│ │ └── PATCH — backward-compatible bug fixes only
│ └────── MINOR — new functionality, backward-compatible (nothing breaks)
└────────── MAJOR — breaking/incompatible API changes
The rule is "bump the leftmost number that applies, and reset the ones to its right to 0":
| Change | From → To |
|---|---|
| Fix a bug, no API change | 1.2.0 → 1.2.1 |
| Add a new component, old code still works | 1.2.1 → 1.3.0 |
| Rename/remove a public API (breaking) | 1.3.0 → 2.0.0 |
For a design-system library, the bump maps cleanly to consumer impact:
- PATCH — fix
CPrimaryButton's disabled color. - MINOR — ship the new
CCards/CTabscomponents (additive). - MAJOR — the
ChaiSteal→ChaiSteelrename, or dropping a public color token (breaks anyone depending on it).
0.x.ymeans "pre-1.0, anything can change" — useful while the API is still settling. Cutv1.0.0once the public API is committed to being stable.- A pre-release suffix like
v1.3.0-alpha01or-rc1marks a not-yet-final build (the same scheme AGP uses).
develop is the integration branch; main is the release line.
- Day-to-day work merges into
developvia PRs. - To cut a release, open a PR from
developintomain. - Once it merges, tag the merge commit on
mainwithvMAJOR.MINOR.PATCH.
The tag on main is the release. Only release-ready code reaches main.