README · Architecture · Security · Contributing · Releasing
This document covers the complete release process for zefer-cli, including the one-time GitHub Actions setup.
npm publishing is done manually from the terminal — no GitHub Actions token required.
npm publish --otp=XXXXXX # enter the 6-digit code from your authenticatorThe prepublishOnly script runs typecheck + build + verify automatically before publishing.
Once the secret is set, every GitHub Release triggers an automatic publish.
# Patch: 1.0.0 → 1.0.1 (bug fixes)
npm version patch
# Minor: 1.0.0 → 1.1.0 (new features, backward-compatible)
npm version minor
# Major: 1.0.0 → 2.0.0 (breaking changes)
npm version majornpm version automatically:
- Updates
versioninpackage.json - Creates a git commit:
"1.0.1" - Creates a git tag:
v1.0.1
Add a new section at the top:
## [1.0.1] - 2026-MM-DD
### Fixed
- ...
### Added
- ...
[1.0.1]: https://github.com/carrilloapps/zefer-cli/compare/v1.0.0...v1.0.1Amend the version commit to include the changelog:
git add CHANGELOG.md
git commit --amend --no-editgit push origin main --tagsnpm publish --otp=XXXXXXOpen your authenticator app, enter the 6-digit OTP. Takes 10 seconds.
npm run release:gh
# or:
gh release create v1.1.0 --generate-notes --title "v1.1.0"The binaries.yml workflow triggers automatically and uploads the standalone binaries for all platforms to the release.
You can monitor the run at:
github.com/carrilloapps/zefer-cli/actions
Binaries are built automatically by binaries.yml on the same release event. The pipeline:
npm run build→dist/index.js(ESM for npm)npm run build:cjs→dist/index.mjs(tsup, all deps bundled,react-devtools-corestubbed)bun build --compile dist/index.mjs --target bun-<platform>→ standalone binary per platform
The Bun runtime is embedded in each binary — end users need nothing pre-installed.
Toolchain: tsup (esbuild) → Bun compile. pkg was evaluated but crashes on yoga-layout's WebAssembly initialization.
To build locally:
# Requires Bun — https://bun.sh
npm run build:cjs
node scripts/build-binaries.mjs
# → binaries/zefer-linux-x64, zefer-macos-*, zefer-win-x64.exe, checksums.txtThe ci.yml workflow runs on every push and PR to main:
| Check | What it verifies |
|---|---|
| Typecheck | tsc --noEmit — zero TypeScript errors |
| Build | tsup — clean ESM bundle produced |
| Smoke: help | zefer --help exits 0 |
| Smoke: keygen | zefer keygen --mode hex --length 32 produces output |
| Smoke: roundtrip | Encrypt a file, decrypt it, diff verifies identical output |
Tested on Node.js 20 and 22.
This project follows Semantic Versioning:
| Change | Version bump |
|---|---|
| Bug fix, documentation, internal refactor | patch |
| New command, new option, new keygen mode | minor |
| Breaking CLI change (flag renamed, output format changed) | major |
| Binary format change (new magic bytes, new ZEFB/ZEFR version) | major — must also update the web app |
| File | What to change |
|---|---|
CHANGELOG.md |
Add new version section |
package.json |
Version bumped automatically by npm version |
Unlike the web app, there are no social preview images or JSON-LD schemas to update.