Release: merge development into beta #286
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: | |
| branches: [main, development, feature/**, bugfix/**, hotfix/**] | |
| pull_request: | |
| branches: [main, master, development, beta] | |
| workflow_dispatch: | |
| jobs: | |
| quality: | |
| uses: ConductionNL/.github/.github/workflows/quality.yml@main | |
| with: | |
| app-name: app-template | |
| php-version: "8.3" | |
| php-test-versions: '["8.3", "8.4"]' | |
| nextcloud-test-refs: '["stable31", "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`). | |
| frontend-checks: '["check:specs", "check:manifest"]' | |
| # ── 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 | |
| hydra-gates-ref: v1.3.0 |