Commit Standards
Overview
All commits follow Conventional Commits for a clear, structured history that enables automated versioning and changelog generation via Changesets. Every commit message must include a type, an optional scope, and a concise description in the imperative mood.
Rules
Follow Conventional Commits Format
Every commit message uses the format type(scope): description. The type indicates the category of change, the scope identifies the affected area, and the description starts with a lowercase verb in present tense.
Correct
Incorrect
Use Correct Scopes
Scopes identify what part of the codebase changed. Use directory-style paths for packages and short labels for cross-cutting concerns.
Recent history (git log -50) shows the team also uses bare-name shorthand: feat(ui) for packages/ui, feat(theme) for packages/theme, chore(extensions/vscode) for the extension. Treat the shorthand as a legitimate alias for the corresponding packages/<name> row above. The directory-style form is preferred for readability.
Correct
Mark Breaking Changes
Breaking changes must include ! after the scope and a BREAKING CHANGE: footer per the Conventional Commits spec. Mark as breaking when removing or renaming public APIs, changing config schema, or modifying CLI flags.
The BREAKING CHANGE: line is a footer, separated from the body by a blank line — not part of the body. Tooling (changesets, semantic-release) greps for footer-shaped lines, so placement matters.
Correct
The structure is:
- Subject —
type(scope)!: description - Blank line
- Body — optional explanation (what / why)
- Blank line
- Footer —
BREAKING CHANGE: <description>(uppercase, with colon)
Include Body and Footer When Needed
Use the body to explain why the change was made and what problem it solves. Use the footer for issue references, co-authors, and breaking change descriptions.
Correct
Make Atomic Commits
Each commit should represent one logical change, build and pass checks independently, and be revertable without side effects.
Correct
Incorrect
Include a Changeset for Version-Bumping Changes
The repo uses Changesets for versioning and changelog generation. CI runs pnpm changeset status --since=origin/main (.github/workflows/ci.yml) — a feature, fix, or breaking-change commit that ships to a published package without a changeset will fail.
Create one with:
Commit the generated file under .changeset/ alongside the change. Doc-only or internal-tooling commits that don't ship to npm can skip this.