Release process¶
This document describes the manual steps a maintainer runs to cut a new ithyno release. The workflow is deliberately narrow: local reproducible builds plus a git tag whose push automatically drives the 3-OS CI build and creates a GitHub Release with all installer assets attached. Signing, notarization, and marketplace publication are out of scope for this workflow — see Out of scope below.
Maintainer sequence¶
- Bump the version across all three owned
package.jsonfiles (package.json,electron/package.json,vscode-extension/package.json;vscode-extension/host/package.jsonis a generated build artifact regenerated byprepack.mjsand is NOT bumped here):
npm run release:version -- <next-version>
# Example: npm run release:version -- 0.0.2-alpha.0
The script validates the argument with semver.valid() and exits non-zero
if the value is not valid semver 2.0.0. No files are modified on failure.
-
Update
CHANGELOG.md: add a## [<next-version>] - YYYY-MM-DDsection summarising the changes in this release. -
Run the release build:
npm run release:build
This runs, in order:
- npm run typecheck
- npm test
- npm run build (web)
- npm run --workspace ithyno-electron build (TypeScript compile of the Electron shell)
- npm run --workspace ithyno-vscode package → vscode-extension/ithyno-<version>.vsix
- npm run --workspace ithyno-electron package:<platform> → electron/dist/ithyno-<version>-<arch>.<ext>
- node scripts/verify-bundle.mjs — bundle-shape + init-from-bundle
byte-compare against templates/.claude/
- node scripts/release-summary.mjs — prints a summary of produced
artifacts (path + size)
Fails fast if any step exits non-zero. Because the summary runs after
verify-bundle, a verify-bundle failure short-circuits before the
summary is printed. For iterating on verification without paying the
full chain's cost, run npm run release:verify-bundle on its own.
- Smoke-test each produced artifact:
- Install and launch the Electron app from its installer (DMG/NSIS/AppImage).
- Install the VSIX in VS Code (
Extensions: Install from VSIX…) and open the dashboard. -
Confirm the displayed version matches the release.
-
Create a git tag:
git tag v<version>
git push origin v<version>
Pushing the v<version> tag automatically triggers
.github/workflows/release.yml, which:
- verifies
package.json.versionmatches the stripped tag (fails loudly if not); - runs
release:buildin parallel on macOS, Windows, and Linux; - runs a
publishjob (gated onrefs/tags/*) that usessoftprops/action-gh-release@v2withpermissions: contents: writeto create a GitHub Release keyed by the tag and attach.vsix,.dmg,.exe, and.AppImageassets.
Branch pushes (including main) do not trigger the workflow — the
tag push is the single authoritative build, so the same commit is never
built twice.
Out of scope¶
The following are not handled by this workflow and are tracked as follow-ups:
| Topic | Notes |
|---|---|
| Code signing (macOS / Windows) | Requires Apple Developer / EV certificates and secure secret storage. |
| Notarization (macOS) | Requires an Apple ID with notarization entitlements and Xcode tools. |
| VS Code Marketplace publish | Requires a VSCE_PAT personal access token from the publisher account. |
| npm registry publish | Requires an npm access token and a decision on the package scope. |
| Auto-update wiring | Requires a signed update manifest and a distribution server (e.g. S3, GitHub Releases). |
When these follow-ups are implemented, update this document to reflect the new steps and move the corresponding items out of the "Out of scope" table.