96solutions / toolbox
PHP git hook manager
Requires
- php: >=8.4
- composer/composer: ~1 || ^2.0
Requires (Dev)
- phpstan/phpstan: ^1.8
- phpunit/phpunit: >=9.0
- symplify/easy-coding-standard: ^12.0
This package is auto-updated.
Last update: 2026-03-19 11:54:43 UTC
README
A PHP library that provides interactive Composer scripts to install and configure Git pre-commit hooks.
Requirements
- PHP >= 8.4
- Composer 2
Installation
composer require 96solutions/toolbox
Usage
Add the hook installer to your project's composer.json scripts:
{
"scripts": {
"install-hooks": "nssolutions\\Toolbox\\Scripts\\InstallHooks::install"
}
}
Run whenever you want to set up or reconfigure the pre-commit hook:
composer run install-hooks
The script is interactive — it will guide you through selecting which tools to enable and configuring options for each one.
How it works
- Looks for
.git/hooks/in the project root. If not found, asks you to provide the path or exits gracefully. - Presents an interactive menu to select which tools to install (e.g. PHPStan, EasyCodingStandard).
- For each selected tool, prompts for relevant options (paths, levels, config files, etc.).
- If a pre-commit hook already exists, asks whether to overwrite, back it up, or cancel.
- Writes a PHP script (
pre-commit) into.git/hooks/and makes it executable.
The generated hook is a PHP CLI script (#!/usr/bin/env php) that resolves staged PHP files at runtime and runs each configured tool against them, exiting on the first failure.
Available tools
| Tool | Description |
|---|---|
| PHPStan | Static analysis at a configurable level |
| EasyCodingStandard | Code style checks with a configurable config file |
Extensibility
The library is designed to be extended with additional tools. Each tool is a self-contained class implementing ToolInterface, responsible for its interactive configuration and hook command generation.
Project structure
src/
├── Scripts/InstallHooks.php # Composer script entry point — orchestrates the interactive flow
├── Tools/
│ ├── ToolInterface.php # Contract: getName(), configure(), getCommand(), isConfigured()
│ ├── PhpStan.php # Prompts for level and paths, resolves vendor/bin/phpstan
│ └── EasyCodingStandard.php # Prompts for config file path, resolves vendor/bin/ecs
└── Hook/
├── HookRenderer.php # Builds the PHP pre-commit script from configured tools
├── HookWriter.php # Resolves hooks dir, handles conflicts, writes + chmod 0755
└── StagedFiles.php # Shell expression helpers for staged file resolution
Development
Setup
composer install
Run in Docker (PHP 8.4)
docker build -t toolbox-php84 .docker/php8.4 docker run --rm -v $(pwd):/app toolbox-php84 composer install docker run --rm -v $(pwd):/app toolbox-php84 vendor/bin/phpunit
Code style
vendor/bin/ecs check src vendor/bin/ecs check src --fix
Static analysis
vendor/bin/phpstan analyse src
Tests
vendor/bin/phpunit
License
MIT — see LICENSE.
TODO
- non-blocking scripts execution
- add the ability to select hooks to install
- add a security check script
- add the ability to run scripts in docker containers
- improve readme
-
- add a screenshot
-
- add links to repository & Packagist
-
- add badges