Skip to content
This repository was archived by the owner on May 29, 2026. It is now read-only.

chore(test): add Vitest infrastructure#43

Merged
rubenvdlinde merged 2 commits into
developmentfrom
chore/add-vitest-setup
Apr 30, 2026
Merged

chore(test): add Vitest infrastructure#43
rubenvdlinde merged 2 commits into
developmentfrom
chore/add-vitest-setup

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Summary

Adds minimal Vitest test infrastructure so future frontend specs can ship with unit tests.

Added:

  • devDeps: vitest@^4.1.5, @vue/test-utils@^1.3.6 (Vue 2 compatible), jsdom@^29.1.1, @vitest/ui@^4.1.5
  • vitest.config.js at repo root with jsdom env, globals enabled, @/ -> src/ alias
  • npm scripts: test, test:watch, test:ui, test:coverage
  • Smoke test at src/__tests__/smoke.test.js proving the runner works

Why: Unblocks frontend implementation agents to add *.test.js files alongside features. @vitest/coverage-v8 is intentionally NOT installed; whoever first wants coverage can add it.

Test plan

  • npm test passes (1 test, 1 file)
  • npm run lint clean (no new errors/warnings)
  • npm run stylelint clean

@rubenvdlinde rubenvdlinde added ready-for-code-review Build complete — awaiting code reviewer ready-for-security-review Code review complete — awaiting security reviewer labels Apr 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/mydash @ 0ce019e

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 103/103
npm ✅ 342/342
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-04-30 11:26 UTC

Download the full PDF report from the workflow artifacts.

rubenvdlinde added a commit that referenced this pull request Apr 30, 2026
Introduces a third dashboard scope (group_shared) alongside the existing
user and admin_template types, plus the visible-to-user resolver, group
sentinel, and admin-only group CRUD.

Implements:
- REQ-DASH-011 (group_shared type + (type, groupId) invariant)
- REQ-DASH-012 (default-group sentinel)
- REQ-DASH-013 (GET /api/dashboards/visible with source tagging)
- REQ-DASH-014 (group-scoped CRUD endpoints + last-in-group guard)

Changes:
- Dashboard entity: TYPE_GROUP_SHARED + DEFAULT_GROUP_ID + SOURCE_*
  constants, nullable groupId field, jsonSerialize includes groupId.
- DashboardMapper: findByGroup, findVisibleToUser (3 indexed queries +
  PHP-side dedup-by-UUID with priority user > group > default), and
  countByGroup helper for the delete guard.
- DashboardFactory::create: accepts type / groupId / gridColumns kwargs
  and enforces the (type, groupId) invariant via InvalidArgumentException.
- DashboardService: createGroupShared, updateGroupShared, deleteGroupShared
  (with admin guard + last-in-group check; default group exempt),
  getVisibleToUser wiring IGroupManager::getUserGroupIds, and isAdmin
  helper.
- PermissionService: getEffectivePermissionLevel returns view_only for
  non-admin members and full for admins on group_shared dashboards
  (single source of truth — the persisted column is preserved for
  forward-compat).
- DashboardApiController: 6 new endpoints (visible, listGroup, getGroup,
  createGroup, updateGroup, deleteGroup) with #[NoAdminRequired] +
  in-body admin checks for mutations (passes gate-route-auth and
  gate-semantic-auth).
- routes.php: 6 new routes with groupId/uuid path requirements.
- Migration Version001005Date20260430000000: adds nullable group_id
  VARCHAR(64) column + composite index (type, group_id) on
  oc_mydash_dashboards. Idempotent column / index checks.
- DashboardTableBuilder: same column + index for fresh installs.
- Frontend store: groupSharedDashboards / defaultGroupDashboards /
  personalDashboards getters, source plumbing for active dashboard,
  routing PUT to /api/dashboards/group/{groupId}/{uuid} when
  source=group|default.
- src/services/api.js: getVisibleDashboards + 5 group-CRUD helpers.
- l10n/en + nl: 3 new error message keys.
- Tests: DashboardFactoryGroupSharedTest covers the invariant guard;
  DashboardTest extended for groupId getter/setter, jsonSerialize, and
  the new constants.

In-passing fixes:
- DashboardService: import WidgetPlacement instead of FQCN reference
  (resolves pre-existing PHPMD MissingImport).

Tasks skipped:
- 6.x seed data: _registers.json does not exist in this repo.
- 9.x Playwright e2e: test infra is in PR #43 (out of scope).
- 7.4 admin UI: deferred to follow-up admin-group-management change.
rubenvdlinde added a commit that referenced this pull request Apr 30, 2026
….005

Centralises every Nextcloud IInitialState::provideInitialState call behind a
typed PHP builder (InitialStateBuilder + Page enum + MissingInitialStateException)
and mirrors it on the JS side with a typed loadInitialState(page) reader that
fills defaults and warns on schema-version mismatch.

- lib/Service/InitialStateBuilder.php: typed setters per page key, REQUIRED_KEYS
  map keyed by Page::WORKSPACE / Page::ADMIN, apply() validates and pushes every
  key plus _schemaVersion (INITIAL_STATE_SCHEMA_VERSION = 1).
- lib/Exception/MissingInitialStateException.php: thrown by apply() with page
  + missing-key context.
- lib/Controller/PageController.php and lib/Settings/MyDashAdmin.php: refactored
  to construct the builder and call apply() — the only sanctioned call sites.
- src/utils/loadInitialState.js: per-page key/default tables mirroring the spec
  Data Model exactly; emits a console.warn on _schemaVersion mismatch.
- src/main.js and src/admin.js: load via the reader and provide() each key by
  identical name (no renaming at the boundary, no ref/reactive wrapping).
- tests/Unit/Service/InitialStateBuilderTest.php: per-page apply pushes every
  key + schema version, missing required key throws, schema-version always
  pushed (5 tests / 28 assertions).
- tests/Unit/Service/InitialStateContractLintTest.php: PHP grep that fails when
  any file under lib/ outside InitialStateBuilder.php calls
  provideInitialState() directly.
- tests/bootstrap.php: register vendor/nextcloud/ocp PSR-4 autoload as fallback
  when running outside the Nextcloud container so OCP-interface mocks resolve.

PR #42 owns the spec text on origin/feature/replica-spec-proposals.

The matching JS-side Vitest scan (loadState\(['"]mydash) is deferred pending
PR #43 (chore/add-vitest-setup); a TODO comment in
InitialStateContractLintTest references the follow-up.
@rubenvdlinde rubenvdlinde force-pushed the chore/add-vitest-setup branch from 670a59e to 7068f89 Compare April 30, 2026 12:01
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/mydash @ 2fedbe2

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 103/103
npm ✅ 342/342
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-04-30 12:03 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde rubenvdlinde merged commit 63abb6d into development Apr 30, 2026
3 checks passed
@rubenvdlinde rubenvdlinde deleted the chore/add-vitest-setup branch April 30, 2026 12:04
rubenvdlinde added a commit that referenced this pull request Apr 30, 2026
Introduces a third dashboard scope (group_shared) alongside the existing
user and admin_template types, plus the visible-to-user resolver, group
sentinel, and admin-only group CRUD.

Implements:
- REQ-DASH-011 (group_shared type + (type, groupId) invariant)
- REQ-DASH-012 (default-group sentinel)
- REQ-DASH-013 (GET /api/dashboards/visible with source tagging)
- REQ-DASH-014 (group-scoped CRUD endpoints + last-in-group guard)

Changes:
- Dashboard entity: TYPE_GROUP_SHARED + DEFAULT_GROUP_ID + SOURCE_*
  constants, nullable groupId field, jsonSerialize includes groupId.
- DashboardMapper: findByGroup, findVisibleToUser (3 indexed queries +
  PHP-side dedup-by-UUID with priority user > group > default), and
  countByGroup helper for the delete guard.
- DashboardFactory::create: accepts type / groupId / gridColumns kwargs
  and enforces the (type, groupId) invariant via InvalidArgumentException.
- DashboardService: createGroupShared, updateGroupShared, deleteGroupShared
  (with admin guard + last-in-group check; default group exempt),
  getVisibleToUser wiring IGroupManager::getUserGroupIds, and isAdmin
  helper.
- PermissionService: getEffectivePermissionLevel returns view_only for
  non-admin members and full for admins on group_shared dashboards
  (single source of truth — the persisted column is preserved for
  forward-compat).
- DashboardApiController: 6 new endpoints (visible, listGroup, getGroup,
  createGroup, updateGroup, deleteGroup) with #[NoAdminRequired] +
  in-body admin checks for mutations (passes gate-route-auth and
  gate-semantic-auth).
- routes.php: 6 new routes with groupId/uuid path requirements.
- Migration Version001005Date20260430000000: adds nullable group_id
  VARCHAR(64) column + composite index (type, group_id) on
  oc_mydash_dashboards. Idempotent column / index checks.
- DashboardTableBuilder: same column + index for fresh installs.
- Frontend store: groupSharedDashboards / defaultGroupDashboards /
  personalDashboards getters, source plumbing for active dashboard,
  routing PUT to /api/dashboards/group/{groupId}/{uuid} when
  source=group|default.
- src/services/api.js: getVisibleDashboards + 5 group-CRUD helpers.
- l10n/en + nl: 3 new error message keys.
- Tests: DashboardFactoryGroupSharedTest covers the invariant guard;
  DashboardTest extended for groupId getter/setter, jsonSerialize, and
  the new constants.

In-passing fixes:
- DashboardService: import WidgetPlacement instead of FQCN reference
  (resolves pre-existing PHPMD MissingImport).

Tasks skipped:
- 6.x seed data: _registers.json does not exist in this repo.
- 9.x Playwright e2e: test infra is in PR #43 (out of scope).
- 7.4 admin UI: deferred to follow-up admin-group-management change.
rubenvdlinde added a commit that referenced this pull request Apr 30, 2026
….005

Centralises every Nextcloud IInitialState::provideInitialState call behind a
typed PHP builder (InitialStateBuilder + Page enum + MissingInitialStateException)
and mirrors it on the JS side with a typed loadInitialState(page) reader that
fills defaults and warns on schema-version mismatch.

- lib/Service/InitialStateBuilder.php: typed setters per page key, REQUIRED_KEYS
  map keyed by Page::WORKSPACE / Page::ADMIN, apply() validates and pushes every
  key plus _schemaVersion (INITIAL_STATE_SCHEMA_VERSION = 1).
- lib/Exception/MissingInitialStateException.php: thrown by apply() with page
  + missing-key context.
- lib/Controller/PageController.php and lib/Settings/MyDashAdmin.php: refactored
  to construct the builder and call apply() — the only sanctioned call sites.
- src/utils/loadInitialState.js: per-page key/default tables mirroring the spec
  Data Model exactly; emits a console.warn on _schemaVersion mismatch.
- src/main.js and src/admin.js: load via the reader and provide() each key by
  identical name (no renaming at the boundary, no ref/reactive wrapping).
- tests/Unit/Service/InitialStateBuilderTest.php: per-page apply pushes every
  key + schema version, missing required key throws, schema-version always
  pushed (5 tests / 28 assertions).
- tests/Unit/Service/InitialStateContractLintTest.php: PHP grep that fails when
  any file under lib/ outside InitialStateBuilder.php calls
  provideInitialState() directly.
- tests/bootstrap.php: register vendor/nextcloud/ocp PSR-4 autoload as fallback
  when running outside the Nextcloud container so OCP-interface mocks resolve.

PR #42 owns the spec text on origin/feature/replica-spec-proposals.

The matching JS-side Vitest scan (loadState\(['"]mydash) is deferred pending
PR #43 (chore/add-vitest-setup); a TODO comment in
InitialStateContractLintTest references the follow-up.
rubenvdlinde added a commit that referenced this pull request Apr 30, 2026
….005 (#45)

Centralises every Nextcloud IInitialState::provideInitialState call behind a
typed PHP builder (InitialStateBuilder + Page enum + MissingInitialStateException)
and mirrors it on the JS side with a typed loadInitialState(page) reader that
fills defaults and warns on schema-version mismatch.

- lib/Service/InitialStateBuilder.php: typed setters per page key, REQUIRED_KEYS
  map keyed by Page::WORKSPACE / Page::ADMIN, apply() validates and pushes every
  key plus _schemaVersion (INITIAL_STATE_SCHEMA_VERSION = 1).
- lib/Exception/MissingInitialStateException.php: thrown by apply() with page
  + missing-key context.
- lib/Controller/PageController.php and lib/Settings/MyDashAdmin.php: refactored
  to construct the builder and call apply() — the only sanctioned call sites.
- src/utils/loadInitialState.js: per-page key/default tables mirroring the spec
  Data Model exactly; emits a console.warn on _schemaVersion mismatch.
- src/main.js and src/admin.js: load via the reader and provide() each key by
  identical name (no renaming at the boundary, no ref/reactive wrapping).
- tests/Unit/Service/InitialStateBuilderTest.php: per-page apply pushes every
  key + schema version, missing required key throws, schema-version always
  pushed (5 tests / 28 assertions).
- tests/Unit/Service/InitialStateContractLintTest.php: PHP grep that fails when
  any file under lib/ outside InitialStateBuilder.php calls
  provideInitialState() directly.
- tests/bootstrap.php: register vendor/nextcloud/ocp PSR-4 autoload as fallback
  when running outside the Nextcloud container so OCP-interface mocks resolve.

PR #42 owns the spec text on origin/feature/replica-spec-proposals.

The matching JS-side Vitest scan (loadState\(['"]mydash) is deferred pending
PR #43 (chore/add-vitest-setup); a TODO comment in
InitialStateContractLintTest references the follow-up.
rubenvdlinde added a commit that referenced this pull request Apr 30, 2026
Introduces a third dashboard scope (group_shared) alongside the existing
user and admin_template types, plus the visible-to-user resolver, group
sentinel, and admin-only group CRUD.

Implements:
- REQ-DASH-011 (group_shared type + (type, groupId) invariant)
- REQ-DASH-012 (default-group sentinel)
- REQ-DASH-013 (GET /api/dashboards/visible with source tagging)
- REQ-DASH-014 (group-scoped CRUD endpoints + last-in-group guard)

Changes:
- Dashboard entity: TYPE_GROUP_SHARED + DEFAULT_GROUP_ID + SOURCE_*
  constants, nullable groupId field, jsonSerialize includes groupId.
- DashboardMapper: findByGroup, findVisibleToUser (3 indexed queries +
  PHP-side dedup-by-UUID with priority user > group > default), and
  countByGroup helper for the delete guard.
- DashboardFactory::create: accepts type / groupId / gridColumns kwargs
  and enforces the (type, groupId) invariant via InvalidArgumentException.
- DashboardService: createGroupShared, updateGroupShared, deleteGroupShared
  (with admin guard + last-in-group check; default group exempt),
  getVisibleToUser wiring IGroupManager::getUserGroupIds, and isAdmin
  helper.
- PermissionService: getEffectivePermissionLevel returns view_only for
  non-admin members and full for admins on group_shared dashboards
  (single source of truth — the persisted column is preserved for
  forward-compat).
- DashboardApiController: 6 new endpoints (visible, listGroup, getGroup,
  createGroup, updateGroup, deleteGroup) with #[NoAdminRequired] +
  in-body admin checks for mutations (passes gate-route-auth and
  gate-semantic-auth).
- routes.php: 6 new routes with groupId/uuid path requirements.
- Migration Version001005Date20260430000000: adds nullable group_id
  VARCHAR(64) column + composite index (type, group_id) on
  oc_mydash_dashboards. Idempotent column / index checks.
- DashboardTableBuilder: same column + index for fresh installs.
- Frontend store: groupSharedDashboards / defaultGroupDashboards /
  personalDashboards getters, source plumbing for active dashboard,
  routing PUT to /api/dashboards/group/{groupId}/{uuid} when
  source=group|default.
- src/services/api.js: getVisibleDashboards + 5 group-CRUD helpers.
- l10n/en + nl: 3 new error message keys.
- Tests: DashboardFactoryGroupSharedTest covers the invariant guard;
  DashboardTest extended for groupId getter/setter, jsonSerialize, and
  the new constants.

In-passing fixes:
- DashboardService: import WidgetPlacement instead of FQCN reference
  (resolves pre-existing PHPMD MissingImport).

Tasks skipped:
- 6.x seed data: _registers.json does not exist in this repo.
- 9.x Playwright e2e: test infra is in PR #43 (out of scope).
- 7.4 admin UI: deferred to follow-up admin-group-management change.
rubenvdlinde added a commit that referenced this pull request Apr 30, 2026
…47)

Introduces a third dashboard scope (group_shared) alongside the existing
user and admin_template types, plus the visible-to-user resolver, group
sentinel, and admin-only group CRUD.

Implements:
- REQ-DASH-011 (group_shared type + (type, groupId) invariant)
- REQ-DASH-012 (default-group sentinel)
- REQ-DASH-013 (GET /api/dashboards/visible with source tagging)
- REQ-DASH-014 (group-scoped CRUD endpoints + last-in-group guard)

Changes:
- Dashboard entity: TYPE_GROUP_SHARED + DEFAULT_GROUP_ID + SOURCE_*
  constants, nullable groupId field, jsonSerialize includes groupId.
- DashboardMapper: findByGroup, findVisibleToUser (3 indexed queries +
  PHP-side dedup-by-UUID with priority user > group > default), and
  countByGroup helper for the delete guard.
- DashboardFactory::create: accepts type / groupId / gridColumns kwargs
  and enforces the (type, groupId) invariant via InvalidArgumentException.
- DashboardService: createGroupShared, updateGroupShared, deleteGroupShared
  (with admin guard + last-in-group check; default group exempt),
  getVisibleToUser wiring IGroupManager::getUserGroupIds, and isAdmin
  helper.
- PermissionService: getEffectivePermissionLevel returns view_only for
  non-admin members and full for admins on group_shared dashboards
  (single source of truth — the persisted column is preserved for
  forward-compat).
- DashboardApiController: 6 new endpoints (visible, listGroup, getGroup,
  createGroup, updateGroup, deleteGroup) with #[NoAdminRequired] +
  in-body admin checks for mutations (passes gate-route-auth and
  gate-semantic-auth).
- routes.php: 6 new routes with groupId/uuid path requirements.
- Migration Version001005Date20260430000000: adds nullable group_id
  VARCHAR(64) column + composite index (type, group_id) on
  oc_mydash_dashboards. Idempotent column / index checks.
- DashboardTableBuilder: same column + index for fresh installs.
- Frontend store: groupSharedDashboards / defaultGroupDashboards /
  personalDashboards getters, source plumbing for active dashboard,
  routing PUT to /api/dashboards/group/{groupId}/{uuid} when
  source=group|default.
- src/services/api.js: getVisibleDashboards + 5 group-CRUD helpers.
- l10n/en + nl: 3 new error message keys.
- Tests: DashboardFactoryGroupSharedTest covers the invariant guard;
  DashboardTest extended for groupId getter/setter, jsonSerialize, and
  the new constants.

In-passing fixes:
- DashboardService: import WidgetPlacement instead of FQCN reference
  (resolves pre-existing PHPMD MissingImport).

Tasks skipped:
- 6.x seed data: _registers.json does not exist in this repo.
- 9.x Playwright e2e: test infra is in PR #43 (out of scope).
- 7.4 admin UI: deferred to follow-up admin-group-management change.
rubenvdlinde added a commit that referenced this pull request May 3, 2026
* chore(test): add Vitest infra (devDeps, config, smoke test)

* chore: update SBOM

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
rubenvdlinde added a commit that referenced this pull request May 3, 2026
….005 (#45)

Centralises every Nextcloud IInitialState::provideInitialState call behind a
typed PHP builder (InitialStateBuilder + Page enum + MissingInitialStateException)
and mirrors it on the JS side with a typed loadInitialState(page) reader that
fills defaults and warns on schema-version mismatch.

- lib/Service/InitialStateBuilder.php: typed setters per page key, REQUIRED_KEYS
  map keyed by Page::WORKSPACE / Page::ADMIN, apply() validates and pushes every
  key plus _schemaVersion (INITIAL_STATE_SCHEMA_VERSION = 1).
- lib/Exception/MissingInitialStateException.php: thrown by apply() with page
  + missing-key context.
- lib/Controller/PageController.php and lib/Settings/MyDashAdmin.php: refactored
  to construct the builder and call apply() — the only sanctioned call sites.
- src/utils/loadInitialState.js: per-page key/default tables mirroring the spec
  Data Model exactly; emits a console.warn on _schemaVersion mismatch.
- src/main.js and src/admin.js: load via the reader and provide() each key by
  identical name (no renaming at the boundary, no ref/reactive wrapping).
- tests/Unit/Service/InitialStateBuilderTest.php: per-page apply pushes every
  key + schema version, missing required key throws, schema-version always
  pushed (5 tests / 28 assertions).
- tests/Unit/Service/InitialStateContractLintTest.php: PHP grep that fails when
  any file under lib/ outside InitialStateBuilder.php calls
  provideInitialState() directly.
- tests/bootstrap.php: register vendor/nextcloud/ocp PSR-4 autoload as fallback
  when running outside the Nextcloud container so OCP-interface mocks resolve.

PR #42 owns the spec text on origin/feature/replica-spec-proposals.

The matching JS-side Vitest scan (loadState\(['"]mydash) is deferred pending
PR #43 (chore/add-vitest-setup); a TODO comment in
InitialStateContractLintTest references the follow-up.
rubenvdlinde added a commit that referenced this pull request May 3, 2026
…47)

Introduces a third dashboard scope (group_shared) alongside the existing
user and admin_template types, plus the visible-to-user resolver, group
sentinel, and admin-only group CRUD.

Implements:
- REQ-DASH-011 (group_shared type + (type, groupId) invariant)
- REQ-DASH-012 (default-group sentinel)
- REQ-DASH-013 (GET /api/dashboards/visible with source tagging)
- REQ-DASH-014 (group-scoped CRUD endpoints + last-in-group guard)

Changes:
- Dashboard entity: TYPE_GROUP_SHARED + DEFAULT_GROUP_ID + SOURCE_*
  constants, nullable groupId field, jsonSerialize includes groupId.
- DashboardMapper: findByGroup, findVisibleToUser (3 indexed queries +
  PHP-side dedup-by-UUID with priority user > group > default), and
  countByGroup helper for the delete guard.
- DashboardFactory::create: accepts type / groupId / gridColumns kwargs
  and enforces the (type, groupId) invariant via InvalidArgumentException.
- DashboardService: createGroupShared, updateGroupShared, deleteGroupShared
  (with admin guard + last-in-group check; default group exempt),
  getVisibleToUser wiring IGroupManager::getUserGroupIds, and isAdmin
  helper.
- PermissionService: getEffectivePermissionLevel returns view_only for
  non-admin members and full for admins on group_shared dashboards
  (single source of truth — the persisted column is preserved for
  forward-compat).
- DashboardApiController: 6 new endpoints (visible, listGroup, getGroup,
  createGroup, updateGroup, deleteGroup) with #[NoAdminRequired] +
  in-body admin checks for mutations (passes gate-route-auth and
  gate-semantic-auth).
- routes.php: 6 new routes with groupId/uuid path requirements.
- Migration Version001005Date20260430000000: adds nullable group_id
  VARCHAR(64) column + composite index (type, group_id) on
  oc_mydash_dashboards. Idempotent column / index checks.
- DashboardTableBuilder: same column + index for fresh installs.
- Frontend store: groupSharedDashboards / defaultGroupDashboards /
  personalDashboards getters, source plumbing for active dashboard,
  routing PUT to /api/dashboards/group/{groupId}/{uuid} when
  source=group|default.
- src/services/api.js: getVisibleDashboards + 5 group-CRUD helpers.
- l10n/en + nl: 3 new error message keys.
- Tests: DashboardFactoryGroupSharedTest covers the invariant guard;
  DashboardTest extended for groupId getter/setter, jsonSerialize, and
  the new constants.

In-passing fixes:
- DashboardService: import WidgetPlacement instead of FQCN reference
  (resolves pre-existing PHPMD MissingImport).

Tasks skipped:
- 6.x seed data: _registers.json does not exist in this repo.
- 9.x Playwright e2e: test infra is in PR #43 (out of scope).
- 7.4 admin UI: deferred to follow-up admin-group-management change.
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

ready-for-code-review Build complete — awaiting code reviewer ready-for-security-review Code review complete — awaiting security reviewer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant