mainis protected. All work lands via pull request.- Use feature branches:
feat/<topic>,fix/<topic>,docs/<topic>,chore/<topic>,release/<version>. - Squash merge into
main. Fast-forward only on the local merge of release branches.
Conventional Commits. The first line is the imperative summary; the body explains the why.
feat(scope): short summary
Longer explanation of the why and the consequences. Wrap at ~72 cols.
npm ci
npm run build
npm run type-check
npm run lint
npm testThe publish.yml workflow runs the same checks under the Validate Before Publish job: build, type-check, lint, and test. All are required before the publish step proceeds.
The docs live under docs/. To preview locally:
npm run docs:devDoc pages must be in current tense, em-dash free, and emoji free. See References for the conventions and outbound-link policy.
Patch (0.x.y) and minor (0.x) releases are cut from main:
- Bump
package.json#version. - Date the
[Unreleased]section inCHANGELOG.mdto## [<version>] - YYYY-MM-DD. - Run
npm run stamp-versionto stamp the version intodocs/public/readme-header.svganddocs/public/og-image.svg. - Open a
release/<version>PR. - After merge,
publish.ymltriggers on themainpush: it verifies the stamped SVGs match the version, builds, type-checks, lints, and publishes to npm and GitHub Packages if the version is not already present. - Push the
v<version>tag.release.ymlfires on the tag: it verifies the stamped SVGs again, extracts the matching## [<version>]section fromCHANGELOG.md, and creates or updates the GitHub release with the changelog notes embedded in the body.
Tags v* are protected against deletion and force-update by repository ruleset.