This project follows the Conventional Commits specification for commit messages. This helps us:
- Automatically generate changelogs
- Easily navigate through git history
- Trigger automated versioning and releases
- Make collaboration easier
Each commit message consists of a header, an optional body, and an optional footer:
<type>(<scope>): <subject>
<body>
<footer>
The header is mandatory and must conform to this format:
<type>(<scope>): <subject>
- type: The type of change (see below)
- scope: Optional. The module/component affected (e.g.,
node,python,cli,install) - subject: A short description of the change (lowercase, no period at end, max 72 chars)
Must be one of the following:
| Type | Description | Example |
|---|---|---|
| feat | A new feature | feat(node): add support for Node.js 22.x |
| fix | A bug fix | fix(python): correct version detection on Windows |
| docs | Documentation only changes | docs: update installation instructions |
| style | Code style changes (formatting, etc.) | style: run gofmt on all files |
| refactor | Code refactoring (no bug fix or feature) | refactor(shim): simplify path resolution logic |
| perf | Performance improvements | perf(install): parallelize downloads |
| test | Adding or updating tests | test(node): add detection tests for nvm |
| build | Build system or dependency changes | build: update go.mod dependencies |
| ci | CI/CD configuration changes | ci: add coverage reporting workflow |
| chore | Other changes (maintenance, etc.) | chore: update .gitignore |
| revert | Revert a previous commit | revert: feat(node): add Node.js 22.x support |
The scope should be the name of the affected module or component:
node- Node.js runtime providerpython- Python runtime providercli- CLI commandsinstall- Installation logicmigrate- Migration functionalityshim- Shim systemconfig- Configuration handlingpath- PATH managementui- User interface / outputtest- Test infrastructuredocs- Documentation
The subject contains a succinct description of the change:
- Use the imperative, present tense: "add" not "added" nor "adds"
- Start with lowercase (but uppercase abbreviations like PR, API, CLI, URL are allowed)
- No period (.) at the end
- Maximum 72 characters
Good examples:
fix(python): handle missing pip.exe on Windowsfeat(cli): add --yes flag to install commanddocs: add troubleshooting section to READMEchore(ci): remove PR coverage commentsfeat: add API endpoint for version lookup
Bad examples:
Fixed bug(missing type, not descriptive)feat(node): Added support for nvm.(wrong tense, period at end)Update code(missing type, not descriptive)
The body should include the motivation for the change and contrast with previous behavior.
- Use the imperative, present tense: "change" not "changed" nor "changes"
- Wrap at 100 characters
- Include the context of the change
The footer should contain:
- Breaking Changes: Start with
BREAKING CHANGE:followed by description - Issue references:
Fixes #123,Closes #456,Relates to #789
docs: fix typo in README
feat(python): add support for pyenv-win detection
Detect Python installations managed by pyenv-win on Windows.
Checks both %USERPROFILE%\.pyenv\pyenv-win\versions and legacy locations.
Fixes #42
fix(cli)!: change global command behavior
BREAKING CHANGE: The `global` command now validates versions before setting.
This may cause existing scripts to fail if they set invalid versions.
Previously, invalid versions were accepted and only failed at runtime.
Now, the command will exit with an error if the version is not installed.
Fixes #156
feat(node): add version caching to improve performance
Cache Node.js version list for 24 hours to reduce network calls.
Significantly improves `list-all node` performance.
Fixes #89
Relates to #72, #98
revert: feat(ruby): add Ruby runtime support
This reverts commit abc123def456.
Reverting due to Windows compatibility issues that need more investigation.
Relates to #234
This project uses squash merges for all pull requests. This means:
- All commits in your PR are combined into a single commit on merge
- The PR title becomes the commit message on the main branch
- Your PR title must follow the conventional commit format
When creating a PR, ensure your title follows the format:
<type>(<scope>): <subject>
For example:
feat(node): add support for Node.js 22.xfix(shim): handle API errors on Windowschore(ci): update PR linting workflow
The PR title is validated automatically - if it doesn't follow the convention, the CI check will fail.
Both PR titles and individual commits are automatically validated using commitlint. If they don't follow this convention, the CI check will fail.
- Write clear, descriptive subjects - Future you will thank you!
- Use the body for context - Explain why not what (code shows what)
- Reference issues - Link to GitHub issues for traceability
- One logical change per commit - Makes history easier to navigate
- Test your changes - Every commit should leave the code in a working state
If your commit messages don't follow the convention:
git commit --amend
# Edit the commit message to follow the convention
git push --force-with-lease# Rebase and reword commits
git rebase -i HEAD~3 # Replace 3 with number of commits to edit
# Mark commits as 'reword' in the editor
# Update each commit message to follow the convention
git push --force-with-leasepick- Keep commit as-isreword- Keep changes but edit commit messagesquash- Combine with previous commitdrop- Remove commit entirely
You can add a commit message template to help remember the format:
# Create template file
cat > ~/.gitmessage << 'EOF'
# <type>(<scope>): <subject>
#
# <body>
#
# <footer>
#
# Types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert
# Scope: node, python, cli, install, migrate, shim, config, path, ui, test, docs
#
# Subject: imperative, lowercase, no period, max 72 chars
# Body: motivation for change, max 100 chars per line
# Footer: breaking changes, issue references
EOF
# Configure git to use it
git config --global commit.template ~/.gitmessageVS Code: Install the "Conventional Commits" extension:
code --install-extension vivaxy.vscode-conventional-commitsIntelliJ/GoLand: Install the "Git Commit Template" plugin
If you have questions about commit message formatting, feel free to ask in your pull request or open a discussion!