The release process is deliberately small. There is one trunk, one workflow, and one trigger: pushing a version tag. No long-lived release branches.
main— the only trunk. Always releasable.gh-pages— the project website. Published automatically; don't hand-edit.- Everything else is a short-lived branch: open it, PR it into
main, squash-merge, then delete it.
Pick the new version X.Y.Z (semver), then:
-
Bump the version in
package.json(the single source of truth). -
Run
npm run version:sync— this propagates the version toextension/manifest.jsonandpyproject.tomlviascripts/sync_version.py. -
Add a
## [X.Y.Z]section toCHANGELOG.mddescribing the changes. -
Open a PR with these edits, get it green, and merge to
main. -
Tag the merge commit and push the tag:
git checkout main && git pull git tag vX.Y.Z git push origin vX.Y.Z
That's it. The Release workflow (.github/workflows/release.yml) takes over on the
v* tag and does the rest:
- verifies
package.json,manifest.json, andpyproject.tomlall match the tag, - confirms the
CHANGELOG.mdsection exists and there are no conflict markers, - runs the unit, Python, and end-to-end test suites,
- builds the extension ZIP, backend bundle, fp16 ONNX model bundle, and Windows installer,
- publishes a GitHub Release with all assets and a
SHA256SUMSfile.
Use a hyphenated tag (e.g. v1.3.0-rc.1). The workflow marks any tag containing -
as a GitHub pre-release automatically. Good for a dry run before a real cut.
- Never tag a commit that isn't on
main. The workflow rejects tags not reachable frommain. - Keep
maingreen — CI (ci.yml) and CodeQL (codeql.yml) run on every push and PR. - Don't create
release/*branches. If a release needs a fix, fix it onmainand cut a new patch tag.