choerulumam / commitlint-php
A powerful Git hooks and commit message linting tool for PHP projects - PHP 7.3+ compatible
Installs: 10
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/choerulumam/commitlint-php
Requires
- php: >=7.3
- symfony/console: ^4.4 || ^5.0 || ^6.0 || ^7.0
Requires (Dev)
- phpunit/phpunit: ^9.5 || ^8.0
README
A powerful Git hooks and commit message linting tool for PHP projects - combining the best of husky and commitlint in a native PHP implementation.
๐ Features
- ๐ฏ Commit Message Validation - Enforce conventional commit format with customizable rules
- ๐ช Git Hooks Management - Easy installation and management of Git hooks
- โ๏ธ Flexible Configuration - Configure via
.commitlintrc.jsonorcomposer.json - ๐ง Developer Friendly - Beautiful CLI output with helpful error messages
- ๐ฆ Minimal Dependencies - Only requires Symfony Console component
- ๐งช Fully Tested - Comprehensive test suite with PHPUnit
- ๐จ PHP 7.3+ Compatible - Works with PHP 7.3 through PHP 8.3
- ๐ Security First - Built-in security features and input validation
Requirements
- PHP >= 7.3
- Composer
- Git
๐ฆ Installation
Install via Composer:
composer require --dev choerulumam/commitlint-php
๐ง Quick Start
1. Install Git Hooks
vendor/bin/commitlint install
2. Start Making Commits!
# โ Valid commits git commit -m "feat: add user authentication" git commit -m "fix(auth): resolve login validation issue" git commit -m "docs: update README with examples" # โ Invalid commits (will be rejected) git commit -m "added new feature" # Missing type git commit -m "FIX: something" # Invalid type case
๐ Commands
Install Hooks
Install Git hooks and create default configuration:
vendor/bin/commitlint install [options]
Options:
--force, -f- Force installation even if hooks already exist--skip-config- Skip creating default configuration file
Validate Commit Message
Validate commit messages against your configuration:
# Validate current commit message (from .git/COMMIT_EDITMSG) vendor/bin/commitlint validate # Validate specific message vendor/bin/commitlint validate "feat: add new feature" # Validate from file vendor/bin/commitlint validate --file=commit.txt # Quiet mode (exit code only) vendor/bin/commitlint validate --quiet
Options:
--file, -f- Read commit message from specific file--quiet, -q- Suppress output (exit code only)
Show Status
Display installed hooks and configuration:
vendor/bin/commitlint status
Uninstall
Remove all installed Git hooks:
vendor/bin/commitlint uninstall [--force]
โ๏ธ Configuration
CommitLint PHP can be configured via .commitlintrc.json file or within your composer.json. The tool automatically merges your custom configuration with sensible defaults.
Configuration File Priority
.commitlintrc.jsonin your project rootextra.commitlint-phpincomposer.json- Default configuration
Complete Configuration Reference
{
"rules": {
"type": {
"required": true,
"allowed": ["feat", "fix", "docs", "style", "refactor", "perf", "test", "chore", "ci", "build", "revert"]
},
"scope": {
"required": false,
"allowed": []
},
"subject": {
"min_length": 1,
"max_length": 100,
"case": "any",
"end_with_period": false
},
"body": {
"max_line_length": 100,
"leading_blank": true
},
"footer": {
"leading_blank": true
}
},
"hooks": {
"commit-msg": true,
"pre-commit": false,
"pre-push": false
}
}
Configuration Options
Type Rules (rules.type)
required(boolean, default:true) - Whether commit type is requiredallowed(array, default: see above) - Array of allowed commit types
Scope Rules (rules.scope)
required(boolean, default:false) - Whether commit scope is requiredallowed(array, default:[]) - Array of allowed scopes (empty = any scope allowed)
Subject Rules (rules.subject)
min_length(int, default:1) - Minimum subject lengthmax_length(int, default:100) - Maximum subject lengthcase(string, default:"any") - Case requirement:"lower","upper", or"any"end_with_period(boolean, default:false) - Whether subject must end with period
Body Rules (rules.body)
max_line_length(int, default:100) - Maximum line length for body (0 = no limit)leading_blank(boolean, default:true) - Require blank line between subject and body
Footer Rules (rules.footer)
leading_blank(boolean, default:true) - Require blank line between body and footer
Hook Configuration (hooks)
Control which Git hooks are installed:
{
"hooks": {
"commit-msg": true, // Validate commit messages
"pre-commit": false, // Run before commits
"pre-push": false // Run before pushes
}
}
๐ Example Configurations
Minimal Configuration
{
"rules": {
"type": {
"allowed": ["feat", "fix", "docs", "chore"]
},
"subject": {
"max_length": 50
}
}
}
Strict Configuration
{
"rules": {
"type": {
"required": true,
"allowed": ["feat", "fix", "docs", "test", "refactor", "chore"]
},
"scope": {
"required": true,
"allowed": ["auth", "api", "ui", "db", "config", "test", "docs"]
},
"subject": {
"min_length": 10,
"max_length": 50,
"case": "lower",
"end_with_period": false
}
}
}
Configuration in composer.json
{
"extra": {
"commitlint-php": {
"rules": {
"type": {
"allowed": ["feat", "fix", "docs", "test", "chore"]
}
}
}
}
}
๐ Commit Message Format
This package enforces the Conventional Commits specification:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
Examples
# Simple commit feat: add user registration # With scope feat(auth): add JWT token validation # With body and footer feat(api): add user endpoints Add comprehensive user management endpoints including: - GET /api/users - POST /api/users - PUT /api/users/{id} - DELETE /api/users/{id} Closes #123 # Breaking change feat(api)!: redesign user authentication BREAKING CHANGE: The authentication API has been completely redesigned. All existing tokens will be invalidated.
Default Commit Types
feat- New featuresfix- Bug fixesdocs- Documentation changesstyle- Code style changes (formatting, etc)refactor- Code refactoringperf- Performance improvementstest- Adding or updating testschore- Maintenance tasksci- CI/CD changesbuild- Build system changesrevert- Reverting previous commits
Special Commit Types (Auto-Skip Validation)
The following commit types automatically skip validation:
- Merge commits -
Merge branch "feature" into main - Revert commits -
Revert "feat: add user authentication" - Initial commits -
Initial commit - Fixup commits -
fixup! feat: add user authentication
๐ ๏ธ Development
Running Tests
# Run all tests composer test # With coverage composer test:coverage
๐ค Contributing
Contributions are welcome! Please read our Contributing Guide for details.
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Acknowledgments
- Inspired by husky and commitlint
- Inspired by dev-kraken/php-commitlint
- Built with Symfony Console
Author
chumam2050 - choerulumam2050@gmail.com