Назад към всички

semver-helper

// Semantic Versioning 2.0.0 reference guide. Quick decision trees and examples for choosing MAJOR, MINOR, or PATCH version bumps.

$ git log --oneline --stat
stars:1,933
forks:367
updated:March 4, 2026
SKILL.mdreadonly
SKILL.md Frontmatter
namesemver-helper
descriptionSemantic Versioning 2.0.0 reference guide. Quick decision trees and examples for choosing MAJOR, MINOR, or PATCH version bumps.
authorGelmir
tagssemver,versioning,release

Semver Helper

Quick reference for Semantic Versioning 2.0.0 decisions.

The Golden Rule

Given version MAJOR.MINOR.PATCH, increment:

LevelBump WhenReset Lower?
MAJOR (X.0.0)Breaking changes (incompatible API changes)Yes, MINOR and PATCH → 0
MINOR (0.X.0)New features (backwards compatible)Yes, PATCH → 0
PATCH (0.0.X)Bug fixes (backwards compatible)No

Quick Decision Tree

Did you change anything users depend on?
├─ No (internal only) → PATCH
└─ Yes
   └─ Did you remove/change existing behavior?
      ├─ Yes → MAJOR
      └─ No (only added new stuff)
         └─ Is the new stuff visible to users?
            ├─ Yes → MINOR
            └─ No → PATCH

Real Examples

🔴 MAJOR (Breaking)

  • Remove a function, endpoint, or CLI flag
  • Change the return type of a function
  • Require a new mandatory parameter
  • Change default behavior significantly
  • Rename something users depend on
  • Upgrade a dependency that forces downstream changes

Examples:

  • removeUser()deleteUser() rename
  • API response format changed from {id: 1} to {data: {id: 1}}
  • Dropping support for Node 16 (if users must upgrade)

🟡 MINOR (Feature)

  • Add new functionality
  • Add optional parameters
  • Add new exports/exports
  • Deprecate old features (warn, don't remove)
  • Performance improvements (no API change)

Examples:

  • Add createUser() alongside existing user functions
  • Add --format json flag to CLI
  • Add new event listeners/hooks
  • Mark old method as deprecated (still works)

🟢 PATCH (Fix)

  • Fix bugs without changing intended behavior
  • Documentation updates
  • Internal refactoring (no visible change)
  • Dependency updates (no API change)
  • Test additions

Examples:

  • Fix null pointer exception
  • Correct typo in error message
  • Fix race condition
  • Update README

Version Progression Examples

ChangesVersion Bump
fix: null pointer1.2.31.2.4
feat: add auth1.2.31.3.0
breaking: remove old API1.2.32.0.0
fix: bug + feat: new thing1.2.31.3.0 (MINOR wins)
fix: bug + breaking: remove API1.2.32.0.0 (MAJOR wins)

Pre-releases

Use suffixes for testing before stable:

  • 2.0.0-alpha.1 — Very early, unstable
  • 2.0.0-beta.2 — Feature complete, testing
  • 2.0.0-rc.1 — Release candidate, final testing

Pre-releases sort before their stable version: 1.0.0-alpha < 1.0.0-beta < 1.0.0-rc < 1.0.0

Common Edge Cases

SituationBumpWhy
Fix a bug that was introduced this versionPATCHStill a fix
Deprecate a feature (but keep it working)MINORNew "deprecated" state is info
Change undocumented/internal behaviorPATCHUsers shouldn't depend on it
Security fix that requires API changeMAJORBreaking for security
Rewriting internals, same behaviorPATCHInvisible to users
Adding tests/docs onlyPATCHNo code change

Anti-Patterns

Don't bump MAJOR for big new features (unless breaking) ❌ Don't bump MINOR for bug fixes ❌ Don't bump PATCH for new functionality ❌ Don't keep old numbers when bumping: 1.2.3 → 2.2.3 is wrong

Cheat Sheet

Users' code breaks? → MAJOR
Users get new toys? → MINOR
Users get fixes? → PATCH