PHPackages                             johnatas-x/angry-bearded - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Testing &amp; Quality](/categories/testing)
4. /
5. johnatas-x/angry-bearded

ActiveProject[Testing &amp; Quality](/categories/testing)

johnatas-x/angry-bearded
========================

Code quality checking tools for Drupal 10/11 projects.

3.3.2(1mo ago)47.2k↓25%1[1 issues](https://github.com/johnatas-x/angry-bearded/issues)[1 PRs](https://github.com/johnatas-x/angry-bearded/pulls)proprietaryPHP &gt;=8.4CI passing

Since Aug 14Pushed 1mo ago1 watchersCompare

[ Source](https://github.com/johnatas-x/angry-bearded)[ Packagist](https://packagist.org/packages/johnatas-x/angry-bearded)[ Docs](https://github.com/johnatas-x/angry-bearded)[ RSS](/packages/johnatas-x-angry-bearded/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (45)Versions (106)Used By (0)

🐦 Angry bearded
===============

[](#-angry-bearded)

[![logo](resources/angry-bearderd.png)](resources/angry-bearderd.png)

This tool is a pre-configured [GrumPHP](https://github.com/phpro/grumphp) for Drupal 10 &amp; 11 projects.

The rules are intentionally strict — feel free to customize the .dist files to suit your needs.

A `.editorconfig` file and a Qodana template are also included.

Caution

Since December 3, 2025, the `dev-develop` version of `phpcompatibility` requires at least `squizlabs/php_codesniffer` **4.0.1**. If you are using an older version of this package, you may encounter a Composer conflict.

To resolve this, add the following line to the `require-dev` section of your `composer.json`:

```
"phpcompatibility/php-compatibility": "10.0.0-alpha2 as dev-develop"
```

Then run:

```
composer update phpcompatibility/php-compatibility
```

🔧 Included tools
----------------

[](#-included-tools)

- ComposerRequireChecker
- Drupal Coder
- PHP Assumptions (phpa)
- PHP Copy/Paste Detector (phpcpd)
- PHP Magic Number Detector (phpmnd)
- PHP Parallel Lint
- PHPMD
- PHPStan
    - PHPStan Banned Code
    - PHPStan Deprecation Rules
    - PHPStan Extension Installer
    - phpstan-drupal
    - Dead code detector for PHP
- PHP\_CodeSniffer
    - PHP Compatibility Coding Standard for PHP CodeSniffer
    - Slevomat Coding Standard
- PhpDeprecationDetector (phpdd)
- Twigcs
    - Twig CS Fixer
- composer-normalize

🚀 Installation
--------------

[](#-installation)

Important

This tool is compatible with multiple versions of Drupal as well as multiple versions of PHP.

Choose the appropriate release for your situation using the table below:

**Drupal 10****Drupal 11****Drupal 12****PHP 8.1**`1.6.*`NANA**PHP 8.2**`1.7.*`NANA**PHP 8.3**`2.*``2.*`NA**PHP 8.4**`2.*``2.*` or `3.*`NA**PHP 8.5**NA`3.*``4.*`

### ➡️ When using drupal/core-composer-scaffold (recommended)

[](#️-when-using-drupalcore-composer-scaffold-recommended)

In most cases, you would already be using the [`drupal/core-composer-scaffold`](https://packagist.org/packages/drupal/core-composer-scaffold) package if you have set up using the latest Drupal templates. This package uses `core-composer-scaffold` to set up configuration files in your project. To make this work, add this package name in your composer's `extra.drupal-scaffold.allowed-packages` section.

```
 "name": "my/project",
  ...
  "extra": {
    "drupal-scaffold": {
      "allowed-packages": [
        "johnatas-x/angry-bearded"
      ],
      ...
    }
  }
```

Now, run `composer require` to include the package in your application. Since the package is now allowed, the `core-composer-scaffold` package will copy the configuration files.

```
# Replace "2.*" with your compatible release (see below).
composer require --dev johnatas-x/angry-bearded:2.*
```

#### 💡 More about scaffolding

[](#-more-about-scaffolding)

As described before, this package uses [`drupal/core-composer-scaffold`](https://github.com/drupal/core-composer-scaffold) plugin to scaffold a few files to the project root. While not strictly required, it’s likely already part of your setup if you're building a Drupal site.

The scaffolding process runs during every Composer operation and may overwrite files. Only the file `grumphp.yml.dist` is not overwritten during later operations. If you are customizing any of the other configuration files and don't want the updates to overwrite your changes, you can override the behavior in your composer.json file. For example, to skip `phpmd.xml.dist` from being overwritten, add this to your `composer.json`:

```
  "name": "my/project",
  ...
  "extra": {
    "drupal-scaffold": {
      "file-mapping": {
        "[project-root]/phpmd.xml.dist": false
      }
    }
  }
```

For more details, read the ["Excluding Scaffold files"](https://github.com/drupal/core-composer-scaffold#excluding-scaffold-files) section of the [documentation](https://github.com/drupal/core-composer-scaffold/blob/8.8.x/README.md) for the core-composer-scaffold plugin.

### ➡️ Without drupal/core-composer-scaffold

[](#️-without-drupalcore-composer-scaffold)

If you're not using the scaffolding plugin, the package won't automatically copy the configuration files.

First, run `composer require` to include the package in your application.

```
# Replace "2.*" with your compatible release (see below).
composer require --dev johnatas-x/angry-bearded:2.*
```

If you don't already have a `grumphp.yml` file in your project, GrumPHP will prompt you to create one — select "No."

Then, copy all `*.dist` files from the package to your project root. The files copied are:

- .editorconfig.dist
- grumphp.yml.dist
- phpcs.xml.dist
- phpmd.xml.dist
- phpstan.neon.dist
- phpstan-drupal.neon.dist
- qodana.yaml.dist

Note

For deprecated checks only with PHPStan Drupal, copy `phpstan-drupal-deprecated.neon.dist` instead of both `phpstan.neon.dist` and `phpstan-drupal.neon.dist`.

Tip

To copy all files, you can run:

```
cp vendor/johnatas-x/angry-bearded/*.dist .
```

🚧 Usage
-------

[](#-usage)

No additional setup is required. However, if Git hooks aren’t triggering, run: `php ./vendor/bin/grumphp git:init`.

For additional commands, look at [grumhp's documentation](https://github.com/phpro/grumphp/blob/master/doc/commands.md).

💈 Customising
-------------

[](#-customising)

- Most customizations start by copying the `grumphp.yml.dist` file to your project root. Make sure you have the file.
- By default, the Drupal logo is used in successful outputs, but you can use GrumPHP's logo modifying `ascii` in `grumphp.yml` or using your own logo.

### ➕ Adding tasks

[](#-adding-tasks)

You can add and customize various tasks in your `grumphp.yml`.

Read the [online documentation for GrumPHP tasks](https://github.com/phpro/grumphp/blob/master/doc/tasks.md) to see the tasks you can use and configure.

### 🛂 Forcing commit message format

[](#-forcing-commit-message-format)

To configure the commit message structure, use the [git\_commit\_message task](https://github.com/phpro/grumphp/blob/master/doc/tasks/git_commit_message.md). For example, to enforce the commit message contains the YouTrack issue ID, use the rule as the following snippet. More options are [documented online](https://github.com/phpro/grumphp/blob/master/doc/tasks/git_commit_message.md).

```
# grumphp.yml
grumphp:
  tasks:
    git_commit_message:
      matchers:
        Must contain issue number: /YouTrack #\d+/
```

### 🚫 Disable commit banners

[](#-disable-commit-banners)

GrumPHP supports banners to celebrate (or scold) on your commit. This is fun, but it is possible it gets on your nerves. If you don’t want it, edit the grumphp.yml file and replace the following parameters:

```
# grumphp.yml
grumphp:
    ascii: ~
```

You could even disable specific ones like this:

```
# grumphp.yml
grumphp:
    ascii:
        succeeded: ~
```

### 🔧 PHPUnit

[](#-phpunit)

PHPUnit dependencies are not bundled in this package because version management is too complex given the compatibility constraints between this tool, multiple Drupal core versions, and PHP versions.

Additionally, this tool intentionally does not include `drupal/core-dev` by default.

However, everything is prepared for easy integration. If you want to add PHPUnit:

1. Create an alias in your `composer.json` from `drupal/coder` 9 to 8, like :

```
"require-dev": {
    "drupal/coder": "9.0.0-alpha1 as 8.3.31",
},
```

2. Add `drupal/core-dev` (using the same version as your Drupal core) as a `require-dev` dependency ;
3. Add `phpunit/phpunit` (using a version compatible with your core) as a `require-dev` dependency ;
4. Add your `phpunit.xml` file at the root of your project ;
5. Enable (and configure) PHPUnit in your `grumphp.yml` file.

Note

Drupal Coder is included in version 9 to benefit from PHP\_CS version 4.

Because Drupal Coder 9 is not compatible with any version of `drupal/core-dev`, it is necessary to define an alias pointing to version 8 (retro-compatibility is fully preserved); otherwise, installing `drupal/core-dev` will fail due to a package conflict.

###  Health Score

55

—

FairBetter than 98% of packages

Maintenance85

Actively maintained with recent releases

Popularity28

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity78

Established project with proven stability

 Bus Factor1

Top contributor holds 64.3% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~9 days

Recently: every ~4 days

Total

102

Last Release

56d ago

Major Versions

1.7.0 → 2.0.02024-08-30

2.8.0-rc6 → 3.0.0-rc12025-10-22

PHP version history (4 changes)1.4.2PHP &gt;=8.1

1.7.0PHP &gt;=8.2

2.0.0PHP &gt;=8.3

3.0.2PHP &gt;=8.4

### Community

Maintainers

![](https://www.gravatar.com/avatar/fb82429ffeb7556ffee9014525e0ba5d3a32cf3a525d6a5e48135ccd50626925?d=identicon)[johnatas-x](/maintainers/johnatas-x)

---

Top Contributors

[![johnatas-x](https://avatars.githubusercontent.com/u/34005481?v=4)](https://github.com/johnatas-x "johnatas-x (227 commits)")[![renovate[bot]](https://avatars.githubusercontent.com/in/2740?v=4)](https://github.com/renovate[bot] "renovate[bot] (126 commits)")

### Embed Badge

![Health badge](/badges/johnatas-x-angry-bearded/health.svg)

```
[![Health](https://phpackages.com/badges/johnatas-x-angry-bearded/health.svg)](https://phpackages.com/packages/johnatas-x-angry-bearded)
```

###  Alternatives

[wp-cli/wp-cli-tests

WP-CLI testing framework

422.7M87](/packages/wp-cli-wp-cli-tests)[axelerant/drupal-quality-checker

Code quality checking tools for Drupal project.

13197.9k1](/packages/axelerant-drupal-quality-checker)[drupal/core-dev

require-dev dependencies from drupal/drupal; use in addition to drupal/core-recommended to run tests from drupal/core.

2021.0M277](/packages/drupal-core-dev)[youwe/testing-suite

Contains Youwe's default testing packages for php.

13176.9k8](/packages/youwe-testing-suite)[acquia/orca

A tool for testing a company's software packages together in the context of a realistic, functioning, best practices Drupal build

32902.4k](/packages/acquia-orca)[chromatic/usher

A collection of Robo commands for use on Chromatic projects.

13534.3k1](/packages/chromatic-usher)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
