rhapsodic / pbump
CLI tool for semantic release versioning and git tagging
Requires
- php: ^8.2
- ext-json: *
- symfony/console: ^7.2 || ^8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.95
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^11.5
This package is auto-updated.
Last update: 2026-05-06 14:07:58 UTC
README
pbump is a CLI tool for semver releases in PHP projects with automatic release commit creation and git tagging.
Features
- bump the version manually (
patch,minor,major,as-is) or by conventional commits (next); - read the current version from
composer.jsonor the latest git tag; - update
composer.jsonwhen the version source is set tocomposer; - run in
dry-runmode without making changes; - optionally release with unrelated uncommitted files while committing only
composer.json; - work interactively through a menu or non-interactively in CI.
Requirements
- PHP
^8.2 - Git
Installation
composer require --dev rhapsodic/pbump
After installation, the binary will be available as vendor/bin/pbump.
Quick Start
Preview what will happen:
php vendor/bin/pbump --dry-run --type=next
Create a patch release without interactive confirmation:
php vendor/bin/pbump --type=patch --yes
Show the current version:
php vendor/bin/pbump --version
Show help:
php vendor/bin/pbump --help
How a Release Works
During a normal pbump run:
- it determines the current version;
- it calculates the target version;
- it updates
composer.jsonwhen needed; - it creates a
chore: release vX.Y.Zcommit; - it creates a git tag;
- it pushes the current branch and tag.
By default, the tag is named vX.Y.Z, but you can disable tagging or provide a custom tag name.
By default, pbump requires a clean working tree. If you need to release while unrelated files are modified, use
--allow-dirty or set "allowDirty": true; in that mode pbump updates composer.json, commits only
composer.json, and leaves the other files untouched.
Release Types
patch-X.Y.Z -> X.Y.(Z+1)minor-X.Y.Z -> X.(Y+1).0major-X.Y.Z -> (X+1).0.0as-is- keep the current versionnext- calculate the bump from conventional commitsconventional- alias fornext
Version Source
The --version-source flag supports three modes:
auto- usecomposer.json.versionfirst, and fall back to the latest git tag if it is missing;composer- always read the version fromcomposer.json.versionand update it during release;tag- always read the version from the latest git tag;composer.jsonis not modified.
If there are no tags yet and the source is tag, the current version is treated as 0.0.0.
The latest tag must contain a semver version at the end of the name, for example v1.2.3 or release-1.2.3.
Configuration via .pbump.config.json
You can create a .pbump.config.json file in the project root with default values:
{
"type": "next",
"versionSource": "auto",
"tag": true,
"push": true,
"yes": false,
"quiet": false,
"allowDirty": false
}
Supported keys:
typedryRuntagpushyesquietversionSourceallowDirty
CLI arguments take precedence over .pbump.config.json.
tag can be:
true- create the standardvX.Y.Ztag;false- do not create a tag;- a string - create a tag with the provided name.
Main Options
-h,--help- show help-v,--version- print the current version--dry-run- show the plan without making changes--type=<type>- explicitly set the release type--version-source=<source>- choose the version source:auto,composer,tag-t,--tag[=<name>]- create a tag, optionally with a custom name--no-tag- do not create a tag-p,--push- push using the current git upstream--no-push- do not push-y,--yes- skip confirmation-q,--quiet- hide the summary--allow-dirty- allow unrelated uncommitted files and commit onlycomposer.json
Interactive and CI Behavior
If --type is not provided and input is interactive, pbump will show a release type selection menu.
For non-interactive runs, it is best to always pass:
php vendor/bin/pbump --type=next --yes
Otherwise, the tool will not be able to ask for confirmation before creating a release.
Development and Tests
Run linter:
composer lint
Run static analysis:
composer analyse
Run tests:
composer test
Format code:
composer format
Run the entrypoint locally without a Composer bin proxy:
php scripts/release.php --help