cloak/coverallskit
Cloak CoverallsKit is a Laravel package that streamlines code coverage reporting, offering a simple toolkit for generating and uploading coverage results to Coveralls from your PHP CI pipeline.
Architecture fit. cloak/coverallskit is a standalone PHP CLI library that reads a Clover-format coverage XML produced by PHPUnit and POSTs it to the Coveralls API. It has no framework coupling, no service provider, no config contract, and no Laravel-specific surface. For a Laravel codebase this means it sits outside the application boundary entirely — it is a CI-time binary, not an application dependency. There is no architectural leverage to be gained: it does not integrate with the container, the test suite lifecycle, Artisan, or the pipeline in any first-class way. Fit is therefore "neutral at best, and neutral only because it sits in require-dev."
Integration feasibility. Mechanically trivial to invoke (vendor/bin/coveralls after a coverage run), but feasibility is undermined by the package's age profile: last release 2015-12-05, archived repository, 2 stars, 0 dependents. A 2015-vintage PHP client will almost certainly carry a pinned, outdated Guzzle major, pre-PSR-4 or early-PSR-4 autoloading assumptions, and no PHP 8.x compatibility (typed properties, union types, match, nullsafe operators, removed each()/create_function()). Installation into a modern Laravel 10/11 application on PHP 8.2/8.3 is likely to fail dependency resolution outright, and if forced through with --ignore-platform-reqs, will fail at runtime. Feasibility for a new integration: low.
Technical risk. Very high, concentrated in four areas:
COVERALLS_REPO_TOKEN handling) or changes the job payload schema, the package breaks permanently.php-coveralls/php-coveralls for a Composer-native path. Choosing this package buys nothing the alternatives don't already do better.Key questions.
coverallsapp/github-action needs only --coverage-clover?Stack fit. Poor. The package predates modern PSR standards enforcement and Laravel's current dependency floor. A Laravel 10/11 app on PHP 8.2 with PHPUnit 10/11 emits Clover XML that this client was never written to parse, and the client's own HTTP layer is a decade behind. The conceptually correct placement — require-dev, invoked from a CI step — is sound; the artifact occupying that slot is not.
Migration path. There is nothing to migrate to this package. The realistic path is the inverse: skip it, and if legacy tooling already references it, migrate away. Recommended target state, in order of preference:
coverallsapp/github-action — zero Composer surface, maintained by Coveralls, reads the Clover file PHPUnit already produces. Lowest total cost of ownership.php-coveralls/php-coveralls — Composer-native, actively used, drop-in CLI shape; acceptable if pipeline portability across non-GitHub CI is required.The migration itself is a one-line CI change plus removal of a dev dependency: phpunit --coverage-clover build/logs/clover.xml stays identical across all three options.
Compatibility. Assume incompatible until proven otherwise. Concrete checks before any pilot: does it resolve under the app's PHP constraint; what Guzzle major does it pin and does that conflict with the app's dev/test stack; does it parse the Clover schema emitted by the current PHPUnit major; does it honor COVERALLS_REPO_TOKEN and CI environment variables the way current Coveralls expects. Each "no" is a blocker given no upstream to patch.
Sequencing. If a pilot is nonetheless mandated (e.g., an existing team convention), sequence it as: (1) spike in a throwaway branch with --ignore-platform-reqs to confirm whether it runs at all; (2) timebox to one day — if it doesn't work cleanly, stop and adopt option 1 above; (3) do not introduce it as a merge gate until it has run green for two weeks; (4) in parallel, open the ticket to replace it. Do not sequence it before basic CI coverage generation — Clover output is the prerequisite and the only durable asset here.
Maintenance. Effectively unbounded, because it is unmaintainable. Archived + 0 dependents + 2 stars means no community patch stream; any fix (PHP version bump, Guzzle upgrade, API change) becomes an internal fork the team owns indefinitely. For a capability that costs one YAML step to obtain otherwise, this is a poor trade. Ongoing cost also includes SCA/compliance exceptions requested every audit cycle.
Support. No vendor, no maintainer, no issue tracker that accepts reports. Internal support is "read the source and patch it." Escalation path is nonexistent, which for a pipeline component means an outage has no external remedy.
Scaling. Coverage upload volume scales fine technically (one POST per CI job), but organizational scaling is the real constraint: every additional repo adopting this package multiplies the fork-maintenance burden, and there is no upstream to absorb the PHP-version treadmill. It also does not scale across languages or across teams using different CI providers — the alternatives do.
Failure modes. Expect: (a) install-time resolution failure on modern PHP; (b) runtime fatal on PHP 8 due to removed functions or untyped-property assumptions; (c) silent upload failure leaving stale coverage on the dashboard — the most dangerous mode, because it degrades trust in the metric without breaking the build; (d) auth breakage if Coveralls changes token handling, with no fix available; (e) intermittent CI flakiness from an HTTP client with outdated timeout/retry semantics. Mitigation for (c) is an explicit assertion step in CI that the upload returned success — which is itself a workaround for the package's shortcomings.
Ramp-up. Near-zero learning curve (it's a single CLI invocation), which is precisely the trap: the low adoption friction masks a high lifetime cost. The ramp-up that actually matters is the replacement ramp-up — roughly half a day for an engineer to switch to the Coveralls GitHub Action and validate the dashboard, which is less than the time it would take to debug the first PHP 8 incompatibility. Recommend against adoption on the basis that total cost of ownership is dominated by abandonment, not by integration effort.
How can I help you explore Laravel packages today?