release-notifylisted
Install: claude install-skill codedev-david/termpolis
# Releasing Termpolis (and getting notified)
Termpolis releases go **directly to `main`** (no branches/PRs). A release is:
**bump `package.json` version → commit + push `main` → push a `vX.Y.Z` tag** (the tag
triggers `.github/workflows/release.yml`). The website repo (`termpolis-web`) auto-deploys
on push to its own `main`.
An email to **engelhart.david.john@gmail.com** is sent **automatically** by
`.github/workflows/notify-release-email.yml` when the Release workflow finishes — ✅ on
success (version, asset count, release URL, and both pipelines' conclusions) and ❌ on
failure. You do not send this yourself; you verify it fired.
## The rule: every pipeline must be green
Two workflows run for a release, and **both must pass**:
| Workflow | Trigger | What it gates |
|---|---|---|
| **Tests** (`test.yml`) | push to `main` | lint (`npm run lint`), typecheck/build, unit + e2e-smoke |
| **Release** (`release.yml`) | `vX.Y.Z` tag | unit tests on win+mac, update-metadata validation, build+sign+publish on 3 OSes, homebrew bump |
A published release with a red pipeline is **not** an acceptable end state.
## Procedure
1. **Verify locally before tagging** — this is where the last few releases broke:
- `npm run lint` — **gate on the full script**, not `npx eslint <file>`. `--report-unused-disable-directives` turns an unused `// eslint-disable*` into a hard **error**, and `no-console` is globally off (`.eslintrc.cjs`), so a stray `eslint-disable-next-line no-console` fails CI ev