| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
GitHooks is a standalone CLI tool (.phar) for managing git hooks and running QA tools in PHP projects. Built with Laravel Zero.
Why GitHooks?
composer require --dev wtyd/githooksNote: for PHP < 8.1 you must add the following events to the scripts section in your composer.json:
"scripts": {
"post-update-cmd": "Wtyd\\GitHooks\\Utils\\ComposerUpdater::phpOldVersions",
"post-install-cmd": "Wtyd\\GitHooks\\Utils\\ComposerUpdater::phpOldVersions"
}Then run composer update wtyd/githooks.
githooks conf:initIn interactive mode, GitHooks detects QA tools in vendor/bin/ and generates a tailored githooks.php. You can also use --no-interaction to copy a template.
githooks hookThis creates a .githooks/ directory with universal hook scripts and configures git config core.hooksPath .githooks. The .githooks/ directory should be committed to version control.
To automate hook installation, add it to your composer.json:
"scripts": {
"post-update-cmd": [
"vendor/bin/githooks hook"
],
"post-install-cmd": [
"vendor/bin/githooks hook"
]
}When you commit, all configured QA tools run automatically. If all checks pass, the commit proceeds. If not, you fix the code and try again.
All checks passed:
parallel_lint - OK. Time: 150ms phpcs_src - OK. Time: 890ms phpstan_src - OK. Time: 2.34s phpmd_src - OK. Time: 1.23s Results: 4/4 passed in 3.45s
Some checks failed:
parallel_lint - OK. Time: 150ms
phpcs_src - OK. Time: 890ms
phpstan_src - KO. Time: 2.34s
phpmd_src - OK. Time: 1.23s
phpstan_src:
/src/Foo.php:12 Access to undefined property $bar
/src/Foo.php:34 Method doSomething() has no return type
Results: 3/4 passed in 3.45s
githooks flow qa # Run a flow (group of jobs)
githooks flow qa --fast # Only staged files (accelerable jobs)
githooks flow qa --fast-branch # Only files changed vs the base branch
githooks flow qa --fast-dirty # Unified working tree (ideal for AI agents)
githooks flow qa --fast-dirty --format=json --no-reports # AI-agent friendly: clean JSON, no side-effect files
githooks flow qa --only-jobs=phpstan_src # Run specific jobs from a flow
githooks flow qa --dry-run # Show commands without executing
githooks job phpstan_src # Run a single job
githooks job phpstan_src --format=json # JSON output for CI integrationGitHooks uses a PHP configuration file (githooks.php) with three sections: hooks, flows, and jobs.
<?php
return [
// Git hooks: map git events to flows/jobs
'hooks' => [
'command' => 'php7.4 vendor/bin/githooks', // optional: customize the hook script command
'pre-commit' => ['qa'],
'pre-push' => [
['flow' => 'full', 'only-on' => ['main', 'develop']], // only on these branches
],
],
// Flows: named groups of jobs with shared execution options
'flows' => [
'options' => ['fail-fast' => false, 'processes' => 2], // global defaults
'qa' => ['jobs' => ['phpcbf_src', 'phpcs_src', 'phpmd_src', 'parallel_lint']],
'full' => ['jobs' => ['phpstan_src', 'phpunit_all']],
// CI flow that picks its mode per branch and declares intra-flow dependencies
'ci' => [
'on' => [
'master' => ['execution' => 'full'], // full on protected branches
'*' => ['execution' => 'fast-branch'], // diff vs base everywhere else
],
'jobs' => [
'yarn_install', // installs node_modules
['job' => 'eslint_src', 'needs' => ['yarn_install']], // waits for install
['job' => 'phpunit_all', 'only-files' => ['src/**', 'tests/**']], // admission gate
],
],
],
// Jobs: individual QA tasks with declarative configuration
'jobs' => [
'phpcs_src' => [
'type' => 'phpcs',
'paths' => ['src'],
'standard' => 'PSR12',
'ignore' => ['vendor'],
// executable-path omitted: auto-detects vendor/bin/phpcs, then system PATH
],
'phpcbf_src' => [
'extends' => 'phpcs_src', // inherits paths, standard, ignore from phpcs
'type' => 'phpcbf', // overrides type
],
'phpmd_src' => [
'type' => 'phpmd',
'executable-path' => 'tools/phpmd', // explicit path when not in vendor/bin
'paths' => ['src'],
'rules' => 'cleancode,codesize,naming,unusedcode',
],
'parallel_lint' => [
'type' => 'parallel-lint',
'paths' => ['src'],
'exclude' => ['vendor'],
],
'phpstan_src' => [
'type' => 'phpstan',
'level' => 8,
'paths' => ['src'],
],
'phpunit_all' => [
'type' => 'phpunit',
'config' => 'phpunit.xml',
],
'composer_audit' => [
'type' => 'custom', // run any command
'script' => 'composer audit',
],
'yarn_install' => [
'type' => 'script', // one-liner; no path filtering
'script' => 'yarn install --frozen-lockfile',
],
'eslint_src' => [
'type' => 'custom',
'executable-path' => 'npx eslint', // structured mode: executable + paths
'paths' => ['resources/js'],
'other-arguments' => '--fix',
'accelerable' => true, // opt-in: filters paths to staged files with --fast
],
],
];See the documentation site for the full configuration reference.
| Tool | Type | Description |
|---|---|---|
| PHP CodeSniffer | phpcs / phpcbf | Code style checking and auto-fixing |
| PHPStan | phpstan | Static analysis |
| Psalm | psalm | Static analysis |
| PHP Mess Detector | phpmd | Code quality rules |
| Parallel-lint | parallel-lint | Syntax checking |
| PHPUnit | phpunit | Unit testing |
| Paratest | paratest | Parallel PHPUnit driver |
| Pest | pest | PHPUnit-based testing framework, Laravel's default runner (vendor/bin/pest or php artisan test) |
| PHP CS Fixer | php-cs-fixer | Code style auto-fixing |
| Rector | rector | Automated code refactoring |
| PHP Copy Paste Detector | phpcpd | Duplicate code detection |
| Inline command | script | Run one executable with fixed arguments (executable-path + other-arguments). No path filtering. |
| Any tool | custom | Run any binary with script (one-liner) or executable-path + paths (+ accelerable: true to opt into --fast / --fast-branch filtering) |
| Commit message | commit-msg | Validate the commit-message subject (declarative rules + conventional-commits preset), wired to Git's commit-msg hook. Runs inline, no shell. |
Two ways to run non-PHP tools:
| Command | Description |
|---|---|
| githooks flow <name> | Run a single flow. |
| githooks flows <name1> <name2>… | Run multiple flows in a combined plan: ad-hoc list, declarative meta-flow, or mixed. Jobs deduped by first occurrence. |
| githooks job <name> | Run a single job. Pass extra args to the underlying tool with --: githooks job phpunit -- --filter=MyTest. |
| githooks hook | Install git hooks via core.hooksPath. |
| githooks hook:clean | Remove installed hooks. |
| githooks status | Show hook installation status. |
| githooks cache:clear [jobs…] | Clear QA tool cache files. Accepts job names, flow names, or no argument (clear all). |
| githooks conf:init | Generate configuration file (interactive or template). |
| githooks conf:check | Validate configuration with deep checks (paths, executables, configs, deprecations, did-you-mean for typos). |
| githooks conf:migrate | Migrate v2 config to v3 format. |
| githooks system:info | Show CPU detection (cgroup-aware) and process configuration. |
| githooks profile <flow> | Chart a metric (time, peak-memory, peak-cores) across the flow's run history as a sparkline with min/p50/p95/max and a trend. Requires recorded runs (see --save-history / history-size). |
| githooks profile:list <flow> | List the runs persisted under .githooks/history/ for a flow. |
| Flag | Purpose |
|---|---|
| --mode=full|fast|fast-branch|fast-dirty / --fast / --fast-branch / --fast-dirty | Select execution mode. fast filters to staged files, fast-branch to files changed vs base branch, fast-dirty to the unified working tree (dirty vs HEAD ∪ untracked). |
| --branch=X (flow only) | Force branch name used to resolve flows.<X>.on => [branch_pattern => …]. Overrides CI env vars and git rev-parse HEAD. In flows/job, branch resolution falls back to $GITHOOKS_BRANCH / CI env / git. |
| --files=a,b,c / --files-from=PATH / --exclude-pattern=glob | Run against an explicit list of files (CSV, manifest, or with exclusion patterns). |
| --processes=N, --fail-fast, --only-jobs=a,b, --exclude-jobs=a,b, --dry-run | Control parallelism, fail-fast behaviour, and job selection. |
| --format=text|json|junit|sarif|codeclimate | Output format on stdout. JSON v2 schema is stable. |
| --report-json=PATH, --report-junit=PATH, --report-sarif=PATH, --report-codeclimate=PATH | Write structured reports to files (one or many at once). --no-reports skips the config-declared reports. |
| --output=PATH | Write the --format=… payload to a file instead of stdout. |
| --show-progress | Force progress to stderr even with a structured --format (CI dashboards). |
| --stats | Print a 5-column table (Job / Status / Time / Peak Cores / Peak Memory) plus temporal attribution at the end of the flow. Also exposes stats block in JSON v2. |
| --save-history (flow / flows) | Persist this run under .githooks/history/ so profile can chart its trend (opt-in; never on --dry-run). |
| --warn-after=N, --fail-after=N, --no-time-budget | Override flow time-budget thresholds (seconds). |
| --memory-warn-above=MB, --memory-fail-above=MB, --no-memory-budget, --allocator=fifo|greedy | Override memory-budget thresholds and 2D allocator strategy. |
See the documentation site for the full command reference.
Full documentation is available at wtyd.github.io/githooks, including:
Contributions are welcome! Send a pull request or open an issue. See the Contributing guide.
The MIT License (MIT). Please see License File for more information.
| Back | FazBrowse Home | New Git URL |