A build script written in JavaScript because it processes the asset manifest, in a repository where everything else is PHP.
the arrangement that stopped the arguments:
bin/ executable entry points, any language,
with a shebang and a --help
tools/ the implementation, one directory per
tool, with its own package.json or
composer.json
Makefile the only thing anybody needs to know
$ make assets → tools/asset-manifest, node
$ make analyse → vendor/bin/phpstan, php
$ make db-reset → bin/db-reset, bash
The Makefile is the interface and the language is an implementation detail, which is what makes a mixed-language repository navigable — nobody needs to know that one target shells out to Node. The rule that keeps it from sprawling is that a tool in a second language needs a reason beyond preference, and processing a JavaScript build artefact is one.