Ship is not done until:
- npm is published
- GitHub Release has the Bun tarball asset
- GitHub Release has the Chrome extension zip
- GitHub Release has the Firefox extension zip
- Homebrew tap is bumped +
brew installverifies
package.jsonversionpackages/core/package.jsonversion(lockstep with CLI)src/version.tsFALLBACK_VERSION(needed for the Bun-compiled binary; it can’t readpackage.json)
-
Preflight
- Clean git:
git status - Auth:
gh auth status,npm whoami
- Clean git:
-
Bump version + notes
- Update version in:
package.jsonpackages/core/package.jsonsrc/version.ts(FALLBACK_VERSION)
- Update
CHANGELOG.md(set the date + bullet notes under the new version header)
- Update version in:
-
Gates (no warnings)
pnpm -s installpnpm -s checkpnpm -s build
-
Build Bun artifact (prints sha256 + creates tarball)
pnpm -s build:bun:test- Artifact:
dist-bun/summarize-macos-arm64-v<ver>.tar.gz
-
Build Chrome extension artifact
pnpm -C apps/chrome-extension buildmkdir -p dist-chromezip -r dist-chrome/summarize-chrome-extension-v<ver>.zip apps/chrome-extension/.output/chrome-mv3
-
Build Firefox extension artifact
pnpm -C apps/chrome-extension build:firefoxmkdir -p dist-firefoxcd apps/chrome-extension/.output/firefox-mv3 && zip -r -FS ../../../../dist-firefox/summarize-firefox-extension-v<ver>.zip . && cd -- Verify:
unzip -l dist-firefox/summarize-firefox-extension-v<ver>.zip | head -20
-
Tag
ver="$(node -p 'require(\"./package.json\").version')" git tag -a "v${ver}" -m "v${ver}" git push --tags
-
GitHub Release + assets
ver="$(node -p 'require(\"./package.json\").version')" # Notes = full changelog section(s), but without a duplicated version header. # If you skipped GitHub Releases for some versions, set prev to the last released version # and include all sections since then. prev="0.6.1" awk -v start="$ver" -v stop="$prev" ' BEGIN { p=0 } $0 ~ ("^## " start " ") { p=1; next } $0 ~ ("^## " stop " ") { p=0 } p { print } ' CHANGELOG.md >"/tmp/summarize-v${ver}-notes.md" gh release create "v${ver}" \ "dist-bun/summarize-macos-arm64-v${ver}.tar.gz" \ "dist-chrome/summarize-chrome-extension-v${ver}.zip" \ "dist-firefox/summarize-firefox-extension-v${ver}.zip" \ --title "v${ver}" \ --notes-file "/tmp/summarize-v${ver}-notes.md"
- Verify notes render (real newlines):
gh release view v<ver> --json body --jq .body
- Verify notes render (real newlines):
-
Homebrew tap bump + verify
- Repo:
~/Projects/homebrew-tap - Update
Formula/summarize.rb:url→ GitHub Release asset URLsha256→ frompnpm build:bun:testversion+ test expectation
git commit -am "chore: bump summarize to <ver>" && git push- Verify:
brew uninstall summarize || true brew tap steipete/tap || true brew install steipete/tap/summarize summarize --version
- Repo:
-
Publish to npm + smoke
- If npm asks for OTP:
npm_config_auth_type=legacy pnpm publish --tag latest --access public --otp <otp>
- Otherwise:
- Publish core first, then CLI:
pnpm -C packages/core publish --tag latest --access publicpnpm publish --tag latest --access public
- Publish core first, then CLI:
- If the CLI forces browser auth, prefer the legacy path above by sourcing
~/.profile(must includeNODE_AUTH_TOKEN) before running the publish command. - Smoke:
ver="$(node -p 'require(\"./package.json\").version')" npm view @steipete/summarize version npm view @steipete/summarize-core version pnpm -s dlx @steipete/summarize@"${ver}" --version pnpm -s dlx @steipete/summarize@"${ver}" --help >/dev/null
- If npm asks for OTP:
Notes:
- npm may prompt for browser auth when
npm config get auth-typeisweb. For scripted publishes, usenpm_config_auth_type=legacy+--otp. preparerunspnpm buildautomatically during publish.
Helper (npm-only): scripts/release.sh (phases: gates|build|publish|smoke|tag|all).
Goal:
- Build a macOS arm64 Bun binary named
summarize - Package as
dist-bun/summarize-macos-arm64-v<ver>.tar.gz - Upload tarball as a GitHub Release asset
- Point Homebrew formula at that asset + sha256
- Formula should install the compiled
summarizebinary directly (no Bun wrapper script).
-
Build the Bun artifact
pnpm build:bun- This uses
bun build --compile --bytecodeand prints the tarball sha256.
-
Smoke test locally (before uploading)
dist-bun/summarize --versiondist-bun/summarize --help- Optional: run one real file/link summary.
-
GitHub Release (when approved)
- Create a release for tag
v<ver>with clean notes (no duplicated version header inside the notes body):- Prefer
--title "v<ver>"and--notes-file …(avoid pasting text with escaped\\n) - Notes should start with sections like
### Changes, not## v<ver>(the release already has a title)
- Prefer
- Upload
dist-bun/summarize-macos-arm64-v<ver>.tar.gz - Verify notes render correctly:
gh release view v<ver> --json body --jq .body(should show real newlines, not literal\\n)
- Create a release for tag
-
Homebrew tap update (when approved + after asset is live)
- Repo:
~/Projects/homebrew-tap - Add/update
Formula/summarize.rb:url= GitHub Release asset URLsha256= from step (1)version=<ver>
- Repo:
-
Homebrew verification (after formula update)
brew uninstall summarize || true brew tap steipete/tap || true brew install steipete/tap/summarize summarize --version
Context: This extension uses UUID-based extension ID {284b5e44-952a-4aa3-8bd3-7ae89d741cde} for team collaboration. The artifact is signed via Mozilla Add-ons (AMO) for self-distribution (not listed in AMO catalog).
Building the artifact:
# Via release script (recommended)
./scripts/release.sh firefox
# Or manually
pnpm -C apps/chrome-extension build:firefox
mkdir -p dist-firefox
cd apps/chrome-extension/.output/firefox-mv3 && \
zip -r -FS ../../../../dist-firefox/summarize-firefox-extension-v<ver>.zip . && \
cd -Verify artifact structure:
# manifest.json must be at root level
unzip -l dist-firefox/summarize-firefox-extension-v<ver>.zip | head -20
# Verify UUID in manifest
unzip -p dist-firefox/summarize-firefox-extension-v<ver>.zip manifest.json | \
python3 -m json.tool | grep -A 3 '"gecko"'
# Test integrity
unzip -t dist-firefox/summarize-firefox-extension-v<ver>.zipSign via AMO (Self Distribution):
- Login: https://addons.mozilla.org/developers/
- Submit Add-on → "On your own" (self-distribution, not "On this site")
- Upload:
dist-firefox/summarize-firefox-extension-v<ver>.zip - Wait for automatic validation (~1-10 minutes, no manual review needed)
- Download signed XPI:
summarize-<ver>.xpi
Install signed XPI:
# Method 1: Drag & drop XPI into Firefox
# Method 2: File → Open File (Cmd+O) → select XPI
# Method 3: Open in Firefox: file:///path/to/summarize-<ver>.xpiVerify installation:
- Extension appears in
about:addons - Sidebar: View → Sidebar → Summarize
- Keyboard shortcut:
Cmd+Shift+U(macOS) /Ctrl+Shift+U(Linux/Windows)
Managing co-authors (after first upload):
- AMO Developer Hub → [Your Add-on] → Settings → Manage Authors
- Click "Add Author" → enter co-author's email
- Co-author accepts invitation via email
- Co-author can now upload updates (Developer or Owner role)
Updating:
- Increment version in
package.json - Rebuild:
pnpm -C apps/chrome-extension build:firefox - Create new zip (same process as above)
- Upload to AMO for signing (self-distribution, same URL)
- Download new signed XPI
- Install in Firefox (replaces old version automatically)
Notes:
- Self-hosted extensions do NOT auto-update through AMO
- For auto-updates: configure
update_urlin manifest (requires hosting update manifest) - For personal/team use: manual updates are simpler
- Extension is NOT listed in AMO catalog (no reviews, no public stats)