Quality gates¶
The Nebula source repository runs its checks in two tiers. If you contribute, or maintain a fork, this is what you run. If you only install Nebula, the two commands at the end are the ones that apply to your store.
Tier 1 blocks a merge¶
The gates run from dev-tools/, which is a Composer project of its own. It is kept separate so the tools never reach a merchant's vendor tree: the source repository carries no vendor/ of its own, and a store installs the split packages rather than this tree. Install the harness once, from the repository root, before running any gate:
That is the exact step CI runs. It resolves a separate qoliber/nebula-dev-tools package that is not published on Packagist, so a fork needs access to that package before the gates will install.
The harness belongs to the source repository alone. It is in none of the 27 split packages the metapackage installs, so on a store there is nothing to run beyond the two commands at the end of this page.
About three minutes, no browser, no live Magento, same answer on every machine:
dev-tools/vendor/bin/nebula-gates # structural checks over the tree
dev-tools/vendor/bin/phpunit --testsuite unit # PHP unit tests
dev-tools/vendor/bin/phpcs # PSR-12 and the Magento standard
cd design/adminhtml/Nebula/backend/web
npm run typecheck # tsc --noEmit
npm test # vitest
Or all of it at once, from the repository root:
A red here is your change. The structural gates check things a test suite cannot: no new RequireJS outside the allowlist, every definition has an acl, the split map matches the tree, the knowledge docs validate, and more.
Two further checks are deterministic and expected green, but need a bootstrapped Magento install:
dev-tools/vendor/bin/phpstan analyse # at the level the harness configures, PHP 8.3 floor
bin/magento nebula:lint # every definition against its schema
Two of the PHP tools have shorter forms defined in the root composer.json. composer phpcs is identical to dev-tools/vendor/bin/phpcs, and composer phpstan runs the analysis with --memory-limit=2G. Both still need the harness installed first.
Tier 2 informs¶
The Playwright browser suite under tests/playwright/ needs a live Magento with seeded fixtures and takes seven to ten minutes. Every permanent red is fixed or quarantined with a named reason in the spec, and a skip is counted separately from a pass. Do not run it at the same time as the gates; the contention produces navigation timeouts that read as JavaScript errors.
When a screen is finished¶
A screen is converted when four things are true, not one:
- It renders: a 200, and not chrome around an empty box.
- Its primary action completes: a record saved and found again.
- Invalid input is rejected, and the screen says so.
- The console is clean of errors from the install's own code.
Check it in a browser: open it, submit it empty and require an answer, do the real thing once and find the record, then click every toolbar button. A button carrying data-nebula-dropped-onclick had its handler stripped and does nothing.