chore: add release workflow (commitlint, husky, lint-staged, release-it)
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
# 0003 — Release workflow
|
||||
|
||||
Date: 2026-06-01
|
||||
Status: accepted
|
||||
|
||||
## Context
|
||||
|
||||
The project needed a consistent, enforced standard for commit messages, changelog generation, versioning, and GitHub releases — especially important since both humans and AI agents (Claude Code, Codex) commit to the repo.
|
||||
|
||||
## Decision
|
||||
|
||||
- **commitlint** (`@commitlint/config-conventional`) enforces conventional commit format at the `commit-msg` git hook
|
||||
- **husky** v9 wires the hooks; `prepare` installs them on `pnpm install`
|
||||
- **lint-staged** runs prettier + eslint on staged files at the `pre-commit` hook
|
||||
- **release-it** + `@release-it/conventional-changelog` manages the full release cycle:
|
||||
- bumps `package.json` version (semver)
|
||||
- generates/prepends to `CHANGELOG.md`
|
||||
- creates a signed git tag (`v{version}`)
|
||||
- creates a GitHub Release with the generated notes
|
||||
- pushes the tag and commit
|
||||
|
||||
Release commands:
|
||||
|
||||
- `pnpm release` — interactive (prompts for increment type)
|
||||
- `pnpm release:patch` / `:minor` / `:major` — non-interactive
|
||||
- `pnpm release:dry` — preview without writing anything
|
||||
- Requires `GITHUB_TOKEN` in env for GitHub Release creation
|
||||
|
||||
Conventional commit types: `feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `perf`, `ci`, `revert`
|
||||
|
||||
## Consequences
|
||||
|
||||
- Every commit is validated; bad format is rejected immediately
|
||||
- CHANGELOG.md is auto-generated from commit history — no manual upkeep
|
||||
- Releases are reproducible: one command, idempotent output
|
||||
- `chore`, `ci`, `test` commits are hidden in the changelog; `feat`, `fix`, `perf`, `refactor`, `docs` are surfaced
|
||||
Reference in New Issue
Block a user