Overview

A Conventional Commit reads type(scope)!: description, with an optional body and footers. Adopt it once releases are automated, because the prefix tells release tooling whether to cut a patch, minor, or major version. Enforce it with a commit hook such as commitlint, not review comments.

Rules

  • The spec defines only feat (MINOR) and fix (PATCH). Types such as docs, refactor, perf, test, build, ci, and chore are common conventions, not requirements.
  • A ! after the type or scope, or a BREAKING CHANGE: footer, means MAJOR regardless of type.
  • With squash merges the PR title becomes the commit message, so lint the title.
  • Skip it for scratch repos and one-off scripts that publish no versioned releases.
feat(auth): add OAuth2 PKCE flow
fix(api): return 422 instead of 500 on invalid JSON
refactor(db)!: rename users.email to users.email_address

BREAKING CHANGE: clients must query email_address.