style: prettier the validator change #333
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Code Quality | |
| on: | |
| push: | |
| # An ALLOW-LIST of branch prefixes is a gate with a hole in it, and the | |
| # hole is SILENT: a branch matching nothing gets no CI at all, and its last | |
| # visible status is whatever it inherited — indistinguishable, on every | |
| # dashboard, from a branch that passed. | |
| # | |
| # Two live examples, both found 2026-08-14: `perf/**` was uncovered in | |
| # openconnector, where a merge carrying unresolved conflict markers and 84 | |
| # failing tests was pushed and nothing ran; and `feat/**` was uncovered in | |
| # openregister — note the list said `feature/**`, so every branch anyone | |
| # named `feat/...` had been running unchecked. | |
| # | |
| # Prefixes are added rather than replaced with `**` because this workflow is | |
| # expensive (PHPUnit matrix, Newman, Playwright). The fast structural checks | |
| # DO run on `**` — see merge-hygiene.yml, added in the same change. | |
| # | |
| # ⚠️ Adding prefixes is not the durable fix; the next invented one is | |
| # uncovered again. The durable fix is branch protection requiring a PR into | |
| # development, which the pull_request trigger below already gates correctly. | |
| branches: | |
| - main | |
| - development | |
| - feature/** | |
| - feat/** | |
| - bugfix/** | |
| - hotfix/** | |
| - perf/** | |
| - refactor/** | |
| - chore/** | |
| - fix/** | |
| pull_request: | |
| branches: [main, master, development, beta] | |
| workflow_dispatch: | |
| jobs: | |
| quality: | |
| uses: ConductionNL/.github/.github/workflows/quality.yml@main | |
| with: | |
| app-name: apptemplate | |
| php-version: "8.3" | |
| php-test-versions: '["8.3", "8.4"]' | |
| # The whole range `appinfo/info.xml` declares (min-version="32", | |
| # max-version="34"), not just its top. With only `stable34` listed, 32 and | |
| # 33 were advertised as supported and tested by nothing. | |
| # `stable34` MUST stay FIRST: newman, playwright and journeydoc-capture | |
| # each read `fromJSON(inputs.nextcloud-test-refs)[0]` as their single | |
| # server, so element 0 is the ref those legs run against — it has to be | |
| # the newest supported release, not whichever ref happens to sort first. | |
| nextcloud-test-refs: '["stable34", "stable32", "stable33"]' | |
| enable-psalm: true | |
| enable-phpstan: true | |
| enable-phpmetrics: true | |
| enable-frontend: true | |
| enable-eslint: true | |
| enable-phpunit: true | |
| enable-newman: true | |
| # `src/manifest.json` declares `"dependencies": ["openregister"]`, and | |
| # nc-vue's CnAppRoot honours that at runtime: when a declared dependency | |
| # app is not enabled it renders the "Required apps are missing" gate | |
| # INSTEAD of the router outlet. That gate has no <main>, no | |
| # `#app-navigation-vue`, and no `.cn-widget-wrapper` — so on a bare CI | |
| # Nextcloud every app-shell assertion fails with "element(s) not found" | |
| # while the app itself is behaving exactly as designed. The app mounts | |
| # fine (the CnAppRoot / manifest-prop test passes); it simply refuses to | |
| # render an app whose backing store is absent. | |
| # | |
| # So the dependency has to exist in the e2e instance, not be asserted | |
| # around. Checked out and `occ app:enable`d by the shared workflow. | |
| additional-apps: '[{"repo":"ConductionNL/openregister","app":"openregister","ref":"main"}]' | |
| enable-sbom: true | |
| # tests/e2e/app-shell.spec.ts is small (7 tests) but every one of them | |
| # exists because the Vue 2 -> Vue 3 migration can break it SILENTLY: | |
| # a failed `createApp().mount()` leaves the server-rendered container in | |
| # place, an unregistered icon paints nothing rather than a fallback, | |
| # a tree-shaken widget registration renders `.cn-unknown-widget` with an | |
| # empty console, and Vue Router 4's dropped `path: '*'` leaves <main> | |
| # blank with no 404. None of those produce an error a unit test or a | |
| # build could see — they only differ from "working" under a browser. | |
| # | |
| # This is the app every Conduction app is scaffolded from, so a silent | |
| # break here propagates to the whole fleet on the next `app-create`. | |
| # | |
| # `playwright-test-path` stays at its default (`tests/e2e`); the root | |
| # `playwright.config.ts` is used, whose `chromium` project depends on the | |
| # `setup` project for auth and testIgnores the journeydoc capture spec. | |
| enable-playwright: true | |
| # ── Frontend Check legs ────────────────────────────────────────────── | |
| # `frontend-checks` defaults to `[]`, and an empty list means the shared | |
| # workflow emits NO "Frontend Check" job at all — so this repo's validator | |
| # family ran nowhere while the run still looked complete. That matters | |
| # more here than anywhere else: this repo is the template every new | |
| # Conduction app is scaffolded from, so a validator that is dark here is | |
| # dark in every app created from it. | |
| # `check:specs` is the aggregate (json-strict + manifest-v2 + register + | |
| # registry), listed as ONE leg rather than four because each leg is a | |
| # fresh job with its own checkout + `npm ci`. `check:manifest` is separate: | |
| # it is not part of that aggregate. | |
| # Measured on this tree before enabling: `check:specs` PASSES, | |
| # `check:manifest` FAILS (`pages[4].type: "roadmap" not in v1.1 enum`). | |
| # | |
| # `format` (prettier --check) is listed here because the shared workflow | |
| # has NO prettier job of its own — it runs eslint and stylelint only. | |
| # Without this leg, `npm run format` would take effect solely on a | |
| # developer's keystrokes and the repo would drift straight back out of | |
| # prettier format between merges, which is precisely the failure mode | |
| # that made the old inert `.prettierrc` worth deleting. | |
| frontend-checks: '["check:specs", "check:manifest", "format"]' | |
| # ── Coverage ratchet ───────────────────────────────────────────────── | |
| # `enable-coverage-guard` defaults to FALSE, which is why both | |
| # "Coverage Baseline Protection" and "Coverage Baseline Check" have only | |
| # ever reported `skipped`. It needs two inputs this repo did not have, | |
| # both added in this commit: `scripts/coverage-guard.php` (byte-identical | |
| # to openregister's) and `.coverage-baseline` = 23.55, this repo's own | |
| # measured coverage (81 of 344 statements) read from clover.xml in the | |
| # `coverage-report` artifact of run 30911186142. | |
| enable-coverage-guard: true | |
| # ── Hydra mechanical gates ─────────────────────────────────────────── | |
| # `enable-hydra-gates` defaults to FALSE, so this tier has never executed | |
| # here — the job reported `skipped`, which the Quality Report renders | |
| # identically to a pass. Again, this is the scaffold template: a gate that | |
| # is off here is off in every app generated from it. | |
| # Pinned to v1.0.1 so a change to the gate package cannot move this repo's | |
| # verdict without a commit here. | |
| # `enable-axe` deliberately NOT set: a vanilla Nextcloud 34 already carries | |
| # serious/critical violations from core's own UI. | |
| # | |
| # v1.0.1 -> v1.3.0 (ConductionNL/.github#159). Two defects, one bump. | |
| # | |
| # 1. STALE. v1.0.1 is `f4d9756` (2026-08-03) and predates three gate | |
| # fixes, so every Hydra Gates run this repo has ever made executed a | |
| # script in which 16 gates reported PASS when their helper never ran | |
| # (#147), gate-33 had no axe report to read and never said so (#148), | |
| # and gates 6 and 7 reported PASS on an EMPTY scope (#149). A gate | |
| # that reports PASS without running emits a tick identical to a real | |
| # one, which is why nothing in this repo's history shows it. | |
| # | |
| # 2. RED. quality.yml is referenced `@main` while this package is | |
| # PINNED, so the two can desync — and on 2026-08-05 they did. #164 | |
| # flipped `hydra-gates-require-full-coverage` to default TRUE, but | |
| # the accounting that makes that flag survivable (NOT APPLICABLE, as | |
| # distinct from a structural or a wiring gap) ships in the PACKAGE. | |
| # So every pin older than `f7eaf2a` now fails the coverage assertion | |
| # for gates it has no subject matter for. Measured diff-scoped, | |
| # exactly as CI scopes it: | |
| # v1.0.1 exit 98 FAIL — "GATES THAT DID NOT RUN: 24 33" | |
| # v1.3.0 exit 0 PASS — those gates named NOT APPLICABLE | |
| # The old pin was not merely stale, it was failing this repo's CI for | |
| # a reason that had nothing to do with this repo. | |
| # | |
| # v1.3.0 is `f7eaf2a` = .github@main, tagged so the ref stays | |
| # reproducible and a later gate change cannot move this repo's verdict | |
| # without a commit here. | |
| enable-hydra-gates: true |