Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
641 commits
Select commit Hold shift + click to select a range
52abef0
refactor(bulk): split the per-dashboard steps of BulkOperationService…
rubenvdlinde Nov 10, 2026
4ce3bb6
refactor(bulk): move parent, status and reindex steps of BulkOperatio…
rubenvdlinde Nov 10, 2026
52f0d89
test(templates): pin the shipped-template update result on every path…
rubenvdlinde Nov 10, 2026
e49f804
refactor(bulk): move the children refusal and the failed-delete outco…
rubenvdlinde Nov 10, 2026
acea917
refactor(templates): split ShippedTemplateUpdateService::update into …
rubenvdlinde Nov 10, 2026
323f824
test(actions): pin every path of the ApplyActionBaseline repair step
rubenvdlinde Nov 10, 2026
3377063
refactor(actions): split ApplyActionBaseline::run into merge, write a…
rubenvdlinde Nov 10, 2026
37e6c23
test(actions): pin the reachable paths of the InitializeActions repai…
rubenvdlinde Nov 10, 2026
e5e39d3
refactor(actions): split InitializeActions::run into read, decode and…
rubenvdlinde Nov 10, 2026
97ef059
refactor(templates): keep the update run to the template id and its i…
rubenvdlinde Nov 10, 2026
b3f7eef
refactor(actions): move the two early reports of ApplyActionBaseline:…
rubenvdlinde Nov 10, 2026
1ee3923
refactor(cleanup): split PurgeOrphanedCascadeData::purgeOrphans into …
rubenvdlinde Nov 10, 2026
714432e
refactor(templates): move the update run construction and the applied…
rubenvdlinde Nov 10, 2026
17eb842
test(templates): pin the resync reports, audit row and notifications …
rubenvdlinde Nov 10, 2026
24eaa54
refactor(versions): split DashboardVersionService::restoreVersion int…
rubenvdlinde Nov 10, 2026
36066a7
test(versions): pin the owner-or-admin refusal of DashboardVersionSer…
rubenvdlinde Nov 10, 2026
2094210
refactor(templates): split TemplateResyncService resync and applyResy…
rubenvdlinde Nov 10, 2026
61aadb7
test(widgets): pin the health-ping, live-tile and weather endpoints b…
rubenvdlinde Nov 10, 2026
7d337b6
refactor(widgets): share the viewer guard and reading responses of th…
rubenvdlinde Nov 10, 2026
159864b
test(kiosk): pin the playlist CRUD endpoints of KioskController befor…
rubenvdlinde Nov 10, 2026
9b43cc7
refactor(kiosk): share the sign-in answer and the failure mapping of …
rubenvdlinde Nov 10, 2026
0fb4106
test(public-share): pin the owner endpoints of PublicShareController …
rubenvdlinde Nov 10, 2026
1309d14
refactor(public-share): share the sign-in answer and the failure mapp…
rubenvdlinde Nov 10, 2026
61b4040
test(public-share): pin the header password, bearer mark and creator …
rubenvdlinde Nov 10, 2026
b81da96
refactor(public-share): split the header password, render payload and…
rubenvdlinde Nov 10, 2026
d113e35
refactor(public-share): move the access answer of PublicShareControll…
rubenvdlinde Nov 10, 2026
e5e2a48
refactor(analytics): share the date-range conditions of the dashboard…
rubenvdlinde Nov 10, 2026
ccf50ab
refactor(dashboards): share the parent-scoped select of DashboardMapp…
rubenvdlinde Nov 10, 2026
05ae37d
refactor(analytics): move the row mapping of the top and summary quer…
rubenvdlinde Nov 10, 2026
57d9545
test(calendar): pin CalendarWidgetService::fetchInternalEvents before…
rubenvdlinde Nov 10, 2026
57ba559
refactor(calendar): split CalendarWidgetService::fetchInternalEvents …
rubenvdlinde Nov 10, 2026
27eb612
test(calendar): pin the re-validation before every ICS request
rubenvdlinde Nov 10, 2026
046896d
refactor(calendar): move the ICS request and cache lifetime of fetchI…
rubenvdlinde Nov 10, 2026
2ed7b75
test(calendar): pin CalendarWidgetService::normalizeInternalEvent for…
rubenvdlinde Nov 10, 2026
8d1399d
test(calendar): pin the allow-list refusal of external ICS URLs
rubenvdlinde Nov 10, 2026
2601a85
refactor(calendar): split normalizeInternalEvent and the external URL…
rubenvdlinde Nov 10, 2026
9da665c
test(users): pin the transfer, delete and rollback order of UserDelet…
rubenvdlinde Nov 10, 2026
64ab084
refactor(users): split the transfer, delete and announce steps of Use…
rubenvdlinde Nov 10, 2026
06c247b
test(acknowledgements): pin the full AcknowledgementService::report b…
rubenvdlinde Nov 10, 2026
f2673ef
refactor(acknowledgements): split AcknowledgementService::report into…
rubenvdlinde Nov 10, 2026
f6c7092
test(widgets): pin the caller guard outcomes of every WidgetApiContro…
rubenvdlinde Nov 10, 2026
322659e
refactor(widgets): share the caller guard, the placement view check a…
rubenvdlinde Nov 10, 2026
1edb074
test(widgets): pin the calendar config extraction and range parsing o…
rubenvdlinde Nov 10, 2026
46a6f15
refactor(widgets): split the calendar range refusals and config extra…
rubenvdlinde Nov 10, 2026
c39a7c8
test(locks): pin every DashboardLockApiController endpoint before sha…
rubenvdlinde Nov 10, 2026
acae5bf
refactor(locks): share the caller guard and the refusal answers of Da…
rubenvdlinde Nov 10, 2026
baff478
test(analytics): pin the caller guard outcomes of the dashboard and t…
rubenvdlinde Nov 10, 2026
4b4534e
refactor(analytics): share the session and action check of the dashbo…
rubenvdlinde Nov 10, 2026
f236f6a
test(dashboards): pin the default widget seed table before moving it …
rubenvdlinde Nov 10, 2026
99ffd22
refactor(dashboards): move the default widget seed table into a constant
rubenvdlinde Nov 10, 2026
9d08217
refactor(dashboards): split the visible-entry lookup and the shared p…
rubenvdlinde Nov 10, 2026
81f2cf4
refactor(dashboards): read the layered placements of getDashboardForU…
rubenvdlinde Nov 10, 2026
c8de63b
test(activity): pin every rendered subject of Extension::parse
rubenvdlinde Nov 10, 2026
58727d5
refactor(activity): split Extension::parse into guard, values and tem…
rubenvdlinde Nov 10, 2026
cd728e8
test(cleanup): pin every path of the launchpad:cleanup:purge command
rubenvdlinde Nov 10, 2026
2bafa53
refactor(cleanup): split the category resolution and unknown-category…
rubenvdlinde Nov 10, 2026
0a0c5b6
test(cli): pin the deletions and output of launchpad:dashboard:delete
rubenvdlinde Nov 10, 2026
796687f
refactor(cli): move the children refusal and descendants note of Dash…
rubenvdlinde Nov 10, 2026
e5655f4
test(resources): pin the failure logs of both ResourceController uplo…
rubenvdlinde Nov 10, 2026
68317d4
refactor(resources): share the store-and-respond step of both upload …
rubenvdlinde Nov 10, 2026
7fac6f7
test(notifications): pin the rendered text and link of every notifica…
rubenvdlinde Nov 10, 2026
9c7668d
refactor(notifications): render each subject's text separately from s…
rubenvdlinde Nov 10, 2026
fbc8dde
test(placements): pin the acknowledgement fields and field order of a…
rubenvdlinde Nov 10, 2026
cb4c5da
refactor(placements): split the position update and the clone copy in…
rubenvdlinde Nov 10, 2026
105d32e
test(sharing): record the write, transaction and notification sequenc…
rubenvdlinde Nov 10, 2026
c486a26
refactor(sharing): split share replacement into validation, a transac…
rubenvdlinde Nov 10, 2026
b3f7466
test(files): pin the failure logs and envelopes of file creation
rubenvdlinde Nov 10, 2026
39d1f6c
refactor(files): move the failure answers of file creation into small…
rubenvdlinde Nov 10, 2026
ff671bd
refactor(files): keep the success answer of file creation laid out as…
rubenvdlinde Nov 10, 2026
b1568f9
refactor(sharing): keep the share delete call laid out as before
rubenvdlinde Nov 10, 2026
21641ec
chore: declare the analysis scope (#1027)
rubenvdlinde Nov 10, 2026
5fc14d4
refactor(admin): split the footer patch and its refusal out of update…
rubenvdlinde Nov 10, 2026
b1b4235
test(admin): pin the answers of createRole, export and import before …
rubenvdlinde Nov 10, 2026
3a05fb7
refactor(admin): split export, import and createRole into named steps
rubenvdlinde Nov 10, 2026
b96298a
refactor(admin): read the acting admin of a template resync in its ow…
rubenvdlinde Nov 10, 2026
af194ff
Merge remote-tracking branch 'origin/development' into quality/f25-ad…
rubenvdlinde Nov 10, 2026
e181f46
test(cli): pin the output of the dashboard show and debug-share commands
rubenvdlinde Nov 10, 2026
64c5bb4
refactor(cli): share the payload printing of the dashboard show and d…
rubenvdlinde Nov 10, 2026
47cb8f6
test(cli): pin the output of the import command before the split
rubenvdlinde Nov 10, 2026
06a3777
refactor(cli): split ImportCommand::execute into import, collision an…
rubenvdlinde Nov 10, 2026
0d89910
test(cli): pin the output and archive of the export command before th…
rubenvdlinde Nov 10, 2026
49217a5
refactor(cli): split ExportCommand into option checks, archive writin…
rubenvdlinde Nov 10, 2026
3a16eae
refactor(cli): read the export target from the options in its own con…
rubenvdlinde Nov 10, 2026
d35df71
test(cli): pin the full install and update output of the template ins…
rubenvdlinde Nov 10, 2026
0527050
refactor(cli): split the install and update reports of TemplateInstal…
rubenvdlinde Nov 10, 2026
9411cc7
test(cli): pin the full output and refusals of the setup command
rubenvdlinde Nov 10, 2026
c634d0c
refactor(cli): split SetupCommand into config reading, step running a…
rubenvdlinde Nov 10, 2026
64f1c56
test(cli): pin the output of the Confluence import command before the…
rubenvdlinde Nov 10, 2026
39ad739
refactor(cli): split ImportConfluenceCommand into request, parent, im…
rubenvdlinde Nov 10, 2026
c418fed
test(dashboards): record the calls of parent validation, subtree dele…
rubenvdlinde Nov 10, 2026
1363f94
refactor(dashboards): split parent validation, subtree delete and tre…
rubenvdlinde Nov 10, 2026
1c5084c
test(translations): record the calls and written fields of the transl…
rubenvdlinde Nov 10, 2026
5f3cb42
refactor(translations): split variant creation, seeding, resolving an…
rubenvdlinde Nov 10, 2026
f68f961
test(locks): record the allowed and refused paths of acquiring and ex…
rubenvdlinde Nov 10, 2026
9636c0c
refactor(locks): split acquiring and extending a lock into a shared v…
rubenvdlinde Nov 10, 2026
ac112bd
test(widgets): pin the tile and placement data read from a request
rubenvdlinde Nov 10, 2026
f638aa0
refactor(widgets): read the tile and placement request fields from ta…
rubenvdlinde Nov 10, 2026
bf31703
test(widgets): pin the serialised shape of a widget placement
rubenvdlinde Nov 10, 2026
3e09b1a
refactor(widgets): split the serialised placement into its field groups
rubenvdlinde Nov 10, 2026
68fadc5
test(dashboards): pin the serialised shape of a dashboard
rubenvdlinde Nov 10, 2026
292a529
refactor(dashboards): split the serialised dashboard into its field g…
rubenvdlinde Nov 10, 2026
64ee139
test(roles): pin every save and delete answer of the role permission …
rubenvdlinde Nov 10, 2026
9530690
refactor(roles): share the list, save and delete answers of the role …
rubenvdlinde Nov 10, 2026
4e261df
refactor(roles): share the group filter of the role assignment and pe…
rubenvdlinde Nov 10, 2026
8439890
test(actions): pin how the action matrix is normalised on read and write
rubenvdlinde Nov 10, 2026
5c6ffc3
refactor(actions): share the matrix normalisation of reading and writ…
rubenvdlinde Nov 10, 2026
e354708
test(dashboards): record the active, activate and template rungs of D…
rubenvdlinde Nov 10, 2026
6ad2bc3
refactor(dashboards): share the placement lookup and shared-dashboard…
rubenvdlinde Nov 10, 2026
7cfdc06
test(reactions): pin every failure answer and the sign-in refusal of …
rubenvdlinde Nov 10, 2026
768644d
refactor(reactions): share the caller guard and failure answers of th…
rubenvdlinde Nov 10, 2026
04e9583
refactor(versions): share the dashboard condition and scalar read of …
rubenvdlinde Nov 10, 2026
81b37d9
test(cli): pin the output of the i18n copy-navigation and migrate com…
rubenvdlinde Nov 10, 2026
93e643c
refactor(cli): move the error envelopes and the confirmation prompt o…
rubenvdlinde Nov 10, 2026
52af5d0
refactor(cli): split the string collection and the signed-release ref…
rubenvdlinde Nov 10, 2026
93803fa
test(cli): pin the output of the dashboard list command before the split
rubenvdlinde Nov 10, 2026
e6a9bfa
refactor(cli): read the dashboard list filters once and split the tab…
rubenvdlinde Nov 10, 2026
3ce7aa5
test(acknowledgements): pin the sign-in, missing-key, not-found and f…
rubenvdlinde Nov 10, 2026
30969ab
refactor(acknowledgements): share the logged failure and report looku…
rubenvdlinde Nov 10, 2026
92ceef0
refactor(cleanup): share the scan envelope and read the acting admin …
rubenvdlinde Nov 10, 2026
1afaac6
refactor(metadata): share the caller refusal of the metadata admin en…
rubenvdlinde Nov 10, 2026
e497691
refactor(visibility): split the rule overview into per-placement coun…
rubenvdlinde Nov 10, 2026
36618b7
test(dashboards): record the child cascade of the tree listener
rubenvdlinde Nov 10, 2026
813a644
refactor(dashboards): split the child cascade of the tree listener in…
rubenvdlinde Nov 10, 2026
f8d89bb
refactor(setup): split the dataset pick and the demo import out of Se…
rubenvdlinde Nov 10, 2026
85c2a39
refactor(admin): split the known and inactive group lists out of Admi…
rubenvdlinde Nov 10, 2026
cc26f23
test(analytics): pin the one name lookup per dashboard of the CSV export
rubenvdlinde Nov 10, 2026
c007726
refactor(analytics): look up the dashboard name of a CSV export row i…
rubenvdlinde Nov 10, 2026
839e465
test(resources): pin the sign-in, action and unreadable-file answers …
rubenvdlinde Nov 10, 2026
10728a1
refactor(resources): share the caller refusal of the resource endpoin…
rubenvdlinde Nov 10, 2026
86c09f8
refactor(resources): split the multipart refusal and the JSON decode …
rubenvdlinde Nov 10, 2026
9715ac4
refactor(feeds): split the tick lock and the refresh log out of FeedR…
rubenvdlinde Nov 10, 2026
b8668a1
test(templates): pin the log line of every template resync job outcome
rubenvdlinde Nov 10, 2026
fd71331
refactor(templates): read the template resync job arguments once and …
rubenvdlinde Nov 10, 2026
aa06c01
test(cleanup): pin which categories the nightly cleanup purges
rubenvdlinde Nov 10, 2026
de89219
refactor(cleanup): split the known-category filter out of the cleanup…
rubenvdlinde Nov 10, 2026
ca5c8e9
test(showcases): pin the not-found and logged failure answers of the …
rubenvdlinde Nov 10, 2026
aad903a
refactor(showcases): split the failure and success answers out of the…
rubenvdlinde Nov 10, 2026
559061e
test(cli): pin the output of the showcase install and list commands
rubenvdlinde Nov 10, 2026
8a81027
refactor(cli): split the install lines and table rows out of the show…
rubenvdlinde Nov 10, 2026
1a9e82f
refactor(sharing): split the recipient conditions and the owner subqu…
rubenvdlinde Nov 10, 2026
f938baf
refactor(sharing): move the view-count update of a public share into …
rubenvdlinde Nov 10, 2026
c74f05d
refactor(attention): split the text, severity, operator and value che…
rubenvdlinde Nov 10, 2026
c95a7de
test(visibility): pin the rule id defaults and the refusals of the vi…
rubenvdlinde Nov 10, 2026
7aa5e3f
refactor(visibility): build each preview rule in its own step
rubenvdlinde Nov 10, 2026
9652729
test(cli): pin the output and exit code of the cleanup scan command
rubenvdlinde Nov 10, 2026
c199636
refactor(cli): split the count table and the notes out of the cleanup…
rubenvdlinde Nov 10, 2026
461fdbb
test(repair): pin every path of the register import repair step
rubenvdlinde Nov 10, 2026
1417f3a
refactor(repair): read the register descriptor of the import repair s…
rubenvdlinde Nov 10, 2026
6ba124a
test(personal-layer): pin the full answer for a person without a layer
rubenvdlinde Nov 10, 2026
427260f
refactor(personal-layer): move the no-layer answer of the personal la…
rubenvdlinde Nov 10, 2026
12fb16e
refactor(reactions): keep each endpoint's action key at its action check
rubenvdlinde Nov 10, 2026
156f633
refactor(metadata): keep each endpoint's action key at its action check
rubenvdlinde Nov 10, 2026
f1b6e85
refactor(resources): keep each endpoint's action key at its action check
rubenvdlinde Nov 10, 2026
d2f5399
refactor(cli): call the file option check on an instance
rubenvdlinde Nov 10, 2026
fbabebe
refactor(roles): call the group filter on an instance
rubenvdlinde Nov 10, 2026
a76d615
refactor(versions): call the dashboard condition on an instance
rubenvdlinde Nov 10, 2026
d08de4e
refactor(admin): read the acting admin of a template resync inline again
rubenvdlinde Nov 10, 2026
39a6702
refactor(resources): take the action check as a callable to keep the …
rubenvdlinde Nov 11, 2026
90f5d0b
test(news): pin NewsWidgetService fetch, merge and parse paths before…
juanclaude-conduction Nov 11, 2026
a3fe776
refactor(news): split NewsWidgetService fetch, parse and sanitise int…
juanclaude-conduction Nov 11, 2026
6caad78
test(news): pin guid dedupe and enclosure thumbnails before the split
juanclaude-conduction Nov 11, 2026
ce43681
refactor(news): replace NewsWidgetService config defaults with lookup…
juanclaude-conduction Nov 11, 2026
7ee1aa3
test(feeds): pin FeedRefreshService guards, request, parsing and swee…
juanclaude-conduction Nov 11, 2026
cfdb0ca
Merge pull request #986 from ConductionNL/quality/f26-footer-service
rubenvdlinde Nov 11, 2026
4e399ca
Merge pull request #987 from ConductionNL/quality/f25-confluence-import
rubenvdlinde Nov 11, 2026
ef72ee1
Merge pull request #988 from ConductionNL/quality/f25-search-provider
rubenvdlinde Nov 11, 2026
80afbe3
Merge pull request #989 from ConductionNL/quality/f26-renderer-state
rubenvdlinde Nov 11, 2026
9b70890
Merge pull request #990 from ConductionNL/quality/f26-visibility-rules
rubenvdlinde Nov 11, 2026
3b81293
Merge pull request #991 from ConductionNL/quality/f25-effective-dashb…
rubenvdlinde Nov 11, 2026
4f7fd35
Merge pull request #992 from ConductionNL/quality/f26-details-tab
rubenvdlinde Nov 11, 2026
771a92e
Merge pull request #993 from ConductionNL/quality/f26-widget-renderer
rubenvdlinde Nov 11, 2026
1cfcb12
Merge pull request #995 from ConductionNL/quality/f26-grid-placement
rubenvdlinde Nov 11, 2026
063d139
Merge pull request #997 from ConductionNL/quality/f26-permission-service
rubenvdlinde Nov 11, 2026
e46ddb6
Merge pull request #998 from ConductionNL/quality/f25-admin-bulk
rubenvdlinde Nov 11, 2026
1292a50
Merge pull request #999 from ConductionNL/quality/f25-files-widget
rubenvdlinde Nov 11, 2026
e1c9f8e
Merge pull request #1001 from ConductionNL/quality/f25-share-api
rubenvdlinde Nov 11, 2026
9146a0b
Merge pull request #1002 from ConductionNL/quality/f25-dashboard-api-…
rubenvdlinde Nov 11, 2026
860210c
Merge pull request #1003 from ConductionNL/quality/f26-host-allow-list
rubenvdlinde Nov 11, 2026
f20c2e1
Merge pull request #1004 from ConductionNL/quality/f25-translation-gu…
rubenvdlinde Nov 11, 2026
69ee1a0
Merge pull request #1005 from ConductionNL/quality/f25-caller-guard-c…
rubenvdlinde Nov 11, 2026
d505fde
Merge pull request #1006 from ConductionNL/quality/f26-uuid-v4
rubenvdlinde Nov 11, 2026
b7cc49b
Merge pull request #1007 from ConductionNL/quality/f26-import-batch
rubenvdlinde Nov 11, 2026
77d4f83
Merge pull request #1008 from ConductionNL/quality/f25-bulk-service
rubenvdlinde Nov 11, 2026
c55d70e
Merge pull request #1009 from ConductionNL/quality/f26-shipped-templa…
rubenvdlinde Nov 11, 2026
31c8399
Merge pull request #1010 from ConductionNL/quality/f25-repair-steps
rubenvdlinde Nov 11, 2026
15d8b87
Merge pull request #1011 from ConductionNL/quality/f25-version-restore
rubenvdlinde Nov 11, 2026
256ca65
Merge pull request #1012 from ConductionNL/quality/f26-template-resync
rubenvdlinde Nov 11, 2026
1d8cd4a
Merge pull request #1013 from ConductionNL/quality/f25-placement-read…
rubenvdlinde Nov 11, 2026
e799236
Merge pull request #1014 from ConductionNL/quality/f25-kiosk
rubenvdlinde Nov 11, 2026
ed78e24
Merge pull request #1015 from ConductionNL/quality/f25-analytics-mappers
rubenvdlinde Nov 11, 2026
8fe0414
Merge pull request #1016 from ConductionNL/quality/f25-calendar
rubenvdlinde Nov 11, 2026
9f63807
Merge pull request #1017 from ConductionNL/quality/f25-user-deleted
rubenvdlinde Nov 11, 2026
b18e5c8
Merge pull request #1018 from ConductionNL/quality/f25-acknowledgement
rubenvdlinde Nov 11, 2026
737a21e
Merge pull request #1019 from ConductionNL/quality/f25-widget-api
rubenvdlinde Nov 11, 2026
5c6e8b5
Merge pull request #1020 from ConductionNL/quality/f25-lock-api
rubenvdlinde Nov 11, 2026
e620c80
Merge pull request #1021 from ConductionNL/quality/f25-analytics-guard
rubenvdlinde Nov 11, 2026
0bf917c
Merge pull request #1022 from ConductionNL/quality/f25-widget-seeds
rubenvdlinde Nov 11, 2026
74b710f
Merge pull request #1023 from ConductionNL/quality/f25-activity-parse
rubenvdlinde Nov 11, 2026
dd85bce
Merge pull request #1024 from ConductionNL/quality/f25-cleanup-command
rubenvdlinde Nov 11, 2026
2c11a6d
Merge pull request #1025 from ConductionNL/quality/f25-resources
rubenvdlinde Nov 11, 2026
d9137b6
Merge pull request #1026 from ConductionNL/quality/f25-notifier
rubenvdlinde Nov 11, 2026
ee66994
Merge pull request #1028 from ConductionNL/quality/f25-file-create
rubenvdlinde Nov 11, 2026
06a034d
Merge pull request #1029 from ConductionNL/quality/f25-share-persist
rubenvdlinde Nov 11, 2026
cd3c9b7
Merge pull request #1030 from ConductionNL/quality/f25-placement-mapper
rubenvdlinde Nov 11, 2026
13329f3
Merge pull request #1032 from ConductionNL/quality/f25-dashboard-comm…
rubenvdlinde Nov 11, 2026
bc22403
Merge pull request #1034 from ConductionNL/quality/f25-tree-service
rubenvdlinde Nov 11, 2026
dbb5494
Merge pull request #1035 from ConductionNL/quality/f25-translation-se…
rubenvdlinde Nov 11, 2026
499a686
Merge pull request #1036 from ConductionNL/quality/f25-lock-service
rubenvdlinde Nov 11, 2026
c72659c
Merge pull request #1037 from ConductionNL/quality/f25-request-extractor
rubenvdlinde Nov 11, 2026
2284e00
Merge pull request #1040 from ConductionNL/quality/f25-dashboard-reso…
rubenvdlinde Nov 11, 2026
75980d6
Merge pull request #1042 from ConductionNL/quality/f25-i18n-commands
rubenvdlinde Nov 11, 2026
c958ebe
Merge pull request #1043 from ConductionNL/quality/f25-ack-controller
rubenvdlinde Nov 11, 2026
b63778f
fix(sharing): harden share input handling and error logging
rubenvdlinde Nov 11, 2026
8b39fbf
Merge pull request #1064 from ConductionNL/fix/sf6-share-input-handling
rubenvdlinde Nov 11, 2026
f88e4e9
Merge pull request #1045 from ConductionNL/quality/f25-conditional-rules
rubenvdlinde Nov 11, 2026
6d2a3f3
Merge pull request #1046 from ConductionNL/quality/f25-setup-controller
rubenvdlinde Nov 11, 2026
0e9870c
Merge pull request #1048 from ConductionNL/quality/f25-background-jobs
rubenvdlinde Nov 11, 2026
76552b9
Merge pull request #1049 from ConductionNL/quality/f25-demo-showcases
rubenvdlinde Nov 11, 2026
dc4cc3e
Merge pull request #1050 from ConductionNL/quality/f25-share-mapper
rubenvdlinde Nov 11, 2026
b63211d
Merge pull request #1051 from ConductionNL/quality/f25-attention
rubenvdlinde Nov 11, 2026
59f1fb1
Merge pull request #1052 from ConductionNL/quality/f25-visibility-pre…
rubenvdlinde Nov 11, 2026
93c2ea8
Merge pull request #1053 from ConductionNL/quality/f25-cleanup-scan
rubenvdlinde Nov 11, 2026
cbb46e6
Merge pull request #1054 from ConductionNL/quality/f25-personal-layer
rubenvdlinde Nov 11, 2026
887ef58
Merge pull request #1056 from ConductionNL/quality/f25-metadata-guard
rubenvdlinde Nov 11, 2026
ca3e18a
Merge pull request #1058 from ConductionNL/quality/f25-admin-endpoints
rubenvdlinde Nov 11, 2026
ed231f1
Merge pull request #1059 from ConductionNL/quality/f25-cli-steps
rubenvdlinde Nov 11, 2026
f09ede2
Merge pull request #1060 from ConductionNL/quality/f25-role-permissio…
rubenvdlinde Nov 11, 2026
fd158b9
Merge pull request #1061 from ConductionNL/quality/f25-reaction-guards
rubenvdlinde Nov 11, 2026
cbdae9b
Merge pull request #1062 from ConductionNL/quality/f25-resource-callers
rubenvdlinde Nov 11, 2026
9057122
Merge pull request #1063 from ConductionNL/quality/g21-news-widget-fetch
rubenvdlinde Nov 11, 2026
a632f79
Merge remote-tracking branch 'origin/development' into quality/g21-fe…
claude Nov 11, 2026
b9a6d25
refactor(feeds): split FeedRefreshService::refreshFeed into guard and…
claude Nov 11, 2026
10afb37
refactor(feeds): split the FeedRefreshService sweep and conditional G…
claude Nov 11, 2026
87e32b2
refactor(feeds): share the feed item shape between the FeedRefreshSer…
claude Nov 11, 2026
325810d
refactor(feeds): move feed parsing and the conditional GET out of Fee…
claude Nov 11, 2026
109540f
refactor(feeds): share the news item shape between the widget and the…
claude Nov 11, 2026
28b9b7f
Merge remote-tracking branch 'origin/development' into quality/f26-sw…
rubenvdlinde Nov 11, 2026
4d835a4
Merge pull request #1000 from ConductionNL/quality/f26-switcher-sections
rubenvdlinde Nov 11, 2026
41dece8
chore(quality): add the maintainability floor and turn on its check
rubenvdlinde Nov 11, 2026
21dbb7a
Merge pull request #1066 from ConductionNL/chore/maintainability-floor
rubenvdlinde Nov 11, 2026
2cbca2c
chore(repo): add the software bill of materials and missing repositor…
rubenvdlinde Nov 11, 2026
4d04ab0
Merge pull request #1067 from ConductionNL/chore/repository-files
rubenvdlinde Nov 11, 2026
b3fd217
test: raise unit coverage past 80% on role permissions, admin roles a…
rubenvdlinde Nov 11, 2026
324a970
chore(coverage): publish measured test coverage
rubenvdlinde Nov 11, 2026
ad6c504
Merge pull request #1085 from ConductionNL/coverage/publish-measured
rubenvdlinde Nov 11, 2026
e7c4dd2
Merge pull request #1065 from ConductionNL/quality/g21-feed-refresh
rubenvdlinde Nov 11, 2026
3e1cb45
chore(sbom): regenerate sbom.cdx.json deterministically
rubenvdlinde Nov 11, 2026
f6bbfa7
Merge pull request #1086 from ConductionNL/chore/sbom-deterministic
rubenvdlinde Nov 11, 2026
db01bb5
chore(licensing): SPDX headers, gitleaks allowlists and OpenSSF Score…
rubenvdlinde Nov 11, 2026
7566738
Merge pull request #1087 from ConductionNL/chore/common-ground-licens…
rubenvdlinde Nov 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .coverage-baseline
Original file line number Diff line number Diff line change
@@ -1 +1 @@
49.47
80.00
40 changes: 40 additions & 0 deletions .github/sig-floor.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"about": "SIG 4-star checks this app meets and must keep meeting (gate 123, sig-floor). Generated by check_sig_floor.py write; raised by the workflow, never lowered by hand.",
"schema": 1,
"profile": "four-star",
"tools": {
"lizard": "1.24.3"
},
"unit_reader": 2,
"measured_at": "9080e1fa1847f34da7d39925e3f7422eb8afbd7b",
"checks": [
"javascript duplication",
"javascript unit_complexity >10",
"javascript unit_complexity >25",
"javascript unit_complexity >5",
"javascript unit_interfacing >2",
"javascript unit_interfacing >4",
"javascript unit_interfacing >6",
"javascript unit_size >15",
"javascript unit_size >30",
"javascript unit_size >60",
"php module_coupling >10",
"php module_coupling >20",
"php module_coupling >50",
"php unit_complexity >10",
"php unit_complexity >25",
"php unit_interfacing >4",
"php unit_interfacing >6",
"php unit_size >60",
"vue duplication",
"vue unit_complexity >10",
"vue unit_complexity >25",
"vue unit_complexity >5",
"vue unit_interfacing >2",
"vue unit_interfacing >4",
"vue unit_interfacing >6",
"vue unit_size >15",
"vue unit_size >30",
"vue unit_size >60"
]
}
3 changes: 3 additions & 0 deletions .github/workflows/branch-policy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ on:
pull_request:
branches: [main, beta, development]

permissions:
contents: read

jobs:
check-source-branch:
name: Branch Policy Check
Expand Down
35 changes: 12 additions & 23 deletions .github/workflows/code-quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -154,29 +154,9 @@ jobs:
with:
app-name: launchpad
php-version: "8.3"
# Pinned, because the shared workflow's DEFAULT is '["stable31", "stable32"]'
# and stable31 CANNOT WORK here. `additional-apps` below installs
# openregister, which declares min-version="32" (its
# lib/ContextChat/ContentProvider.php implements
# OCP\ContextChat\IContentProvider, absent from core before NC32). On NC31
# `occ app:enable openregister` fails with
# App "Open Register" cannot be installed because it is not compatible
# with this version of the server.
# and the run continues anyway, because that failure is only a ::warning::.
# Every /apps/openregister/... call then returns Nextcloud's HTML 404 page.
#
# Order matters as much as membership: newman, playwright and
# journeydoc-capture all check out `fromJSON(nextcloud-test-refs)[0]` as
# their single server, so with the inherited default those three jobs ran
# entirely on the version openregister cannot load.
#
# THE LIST IS THE WHOLE DECLARED RANGE. This comment previously said
# "launchpad's own appinfo/info.xml floor stays at 29 … the NC32 constraint
# here is a property of the CI fixture, not of launchpad's code" — that is
# no longer true of the file it describes. info.xml on this branch declares
# <nextcloud min-version="32" max-version="34"/>, so 32 is the app's own
# floor, not a fixture artefact, and 32, 33 and 34 each get a leg.
nextcloud-test-refs: '["stable34", "stable32", "stable33"]'
# nextcloud-test-refs is deliberately not set: the shared quality.yml
# derives the Nextcloud matrix from appinfo/info.xml (min-version 32 to
# max-version 35), so the tested range follows the declared range.
enable-psalm: true
enable-phpstan: true
enable-phpmetrics: true
Expand Down Expand Up @@ -377,6 +357,15 @@ jobs:
# deliberate). Floating both halves keeps caller and callee in step,
# which is the only configuration in which a pinned path cannot expire.
enable-hydra-gates: true
# Gate 122 (SIG unit ratchet) blocks: a unit this change adds or makes
# worse must stay at NLOC 60, McCabe 10 and at most 4 parameters, and a
# new duplicated fragment of 6+ lines fails. Units the change does not
# touch, or touches without making worse, are inherited and do not count.
hydra-gates-sig-blocking: true
# Maintainability floor: no rating in .maintainability-floor.json may drop
# more than 0.01 against the merge base (pull request) or below the
# committed floor (push). The floor is raised after improving merges.
enable-maintainability-floor: true
# ── Cost controls (see ConductionNL/.github#596, #599) ───────────────
# Run PHPUnit and Playwright only when the diff could change their
# verdict. Fails safe TOWARDS running: an unreadable diff, a force-push,
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/documentation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,14 @@ on:
pull_request:
branches: [development]

permissions:
contents: read

jobs:
deploy:
permissions:
contents: write
packages: write
uses: ConductionNL/.github/.github/workflows/documentation.yml@main
# A reusable workflow receives NO secrets by default. Without this block the
# callee's publish step finds CF_API_TOKEN empty, skips itself on its own
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/issue-triage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,14 @@ on:
type: boolean
default: true

permissions:
contents: read

jobs:
triage:
permissions:
issues: write
contents: read
uses: ConductionNL/.github/.github/workflows/issue-triage.yml@main
with:
app-name: launchpad
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/openspec-sync.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,14 @@ on:
paths: ['openspec/**']
workflow_dispatch:

permissions:
contents: read

jobs:
sync:
permissions:
issues: write
contents: read
uses: ConductionNL/.github/.github/workflows/openspec-sync.yml@main
with:
app-name: launchpad
Expand Down
12 changes: 12 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,15 @@ concurrency:
group: release-${{ github.ref_name }}
cancel-in-progress: false

permissions:
contents: read

jobs:
unstable:
if: github.ref == 'refs/heads/development'
permissions:
contents: write
pull-requests: write
uses: ConductionNL/.github/.github/workflows/release.yml@main
with:
release-type: unstable
Expand All @@ -38,6 +44,9 @@ jobs:

beta:
if: github.ref == 'refs/heads/beta'
permissions:
contents: write
pull-requests: write
uses: ConductionNL/.github/.github/workflows/release.yml@main
with:
release-type: beta
Expand All @@ -46,6 +55,9 @@ jobs:

stable:
if: github.ref == 'refs/heads/main'
permissions:
contents: write
pull-requests: write
uses: ConductionNL/.github/.github/workflows/release.yml@main
with:
release-type: stable
Expand Down
52 changes: 52 additions & 0 deletions .github/workflows/scorecard.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>
# SPDX-License-Identifier: EUPL-1.2

# OpenSSF Scorecard: rates this repository's supply-chain practices and
# publishes the result to the public Scorecard API and the Security tab.
name: Scorecard supply-chain security

on:
branch_protection_rule:
schedule:
- cron: '30 4 * * 1'
push:
branches: [main]
workflow_dispatch:

permissions: read-all

jobs:
analysis:
name: Scorecard analysis
runs-on: ubuntu-latest
permissions:
# Upload the results to code scanning.
security-events: write
# Publish the results and get a badge (OIDC token for the Scorecard API).
id-token: write
contents: read
actions: read
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

- name: Run analysis
uses: ossf/scorecard-action@fa7117db83c52d787ae5a89f350999701505d78e # v2.5.0
with:
results_file: results.sarif
results_format: sarif
publish_results: true

- name: Upload artifact
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: SARIF file
path: results.sarif
retention-days: 5

- name: Upload to code scanning
uses: github/codeql-action/upload-sarif@33d7b85da1a04171e211befe2c739303b9a4c066 # v4.39.3
with:
sarif_file: results.sarif
6 changes: 6 additions & 0 deletions .github/workflows/sync-to-beta.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ on:
branches:
- development

permissions:
contents: read

jobs:
sync:
permissions:
contents: write
pull-requests: write
uses: ConductionNL/.github/.github/workflows/sync-to-beta.yml@main
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,7 @@ Thumbs.db
/custom_apps/
/config/

# SBOM is published as release asset (see SECURITY.md), not stored in repo
sbom.cdx.json
# Intermediate SBOM files. The merged sbom.cdx.json at the root is committed.
bom-php.cdx.json
bom-npm.cdx.json

Expand Down
55 changes: 55 additions & 0 deletions .gitleaks.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# gitleaks configuration: the default rules, plus allowlists for findings
# that are not secrets. Each allowlist names the exact files and only the
# rules that fire there, so anything else in those files is still reported.

[extend]
useDefault = true

[[allowlists]]
description = "Documentation examples: the default admin:admin login of the local development and demo containers."
targetRules = ["curl-auth-user"]
paths = [
'''(^|/)docs/Installation/demo\-environment\.md$''',
]

[[allowlists]]
description = "Spec scenario: an example public-share token in a Given/When/Then step, not a credential."
targetRules = ["generic-api-key"]
paths = [
'''(^|/)openspec/changes/archive/2026\-06\-14\-dashboard\-public\-share/specs/dashboard\-public\-share/spec\.md$''',
]

[[allowlists]]
description = "Smoke-test notes: curl logins of the throwaway local test users (admin, user, alice)."
targetRules = ["curl-auth-user"]
paths = [
'''(^|/)openspec/changes/archive/2026\-06\-14\-role\-based\-content/smoke\.md$''',
]

[[allowlists]]
description = "Spec example: a truncated sample JWT in an SDK usage snippet, not a credential."
targetRules = ["generic-api-key"]
paths = [
'''(^|/)openspec/changes/embedded\-analytics/specs/sdk\-and\-rendering\.md$''',
]

[[allowlists]]
description = "Design note: a curl example with a user:app-password placeholder."
targetRules = ["curl-auth-user"]
paths = [
'''(^|/)openspec/changes/governance\-rest\-api\-reference/design\.md$''',
]

[[allowlists]]
description = "Spec scenario: an example public-share token in a Given/When/Then step, not a credential."
targetRules = ["generic-api-key"]
paths = [
'''(^|/)openspec/specs/dashboard\-public\-share/spec\.md$''',
]

[[allowlists]]
description = "E2E seed script: curl login built from the ADMIN_USER/ADMIN_PASSWORD environment variables, not a literal."
targetRules = ["curl-auth-user"]
paths = [
'''(^|/)tests/e2e/seed\.sh$''',
]
21 changes: 21 additions & 0 deletions .maintainability-floor.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"measured_at": "2026-11-11T15:41:23Z",
"commit": "4d835a4387a923ae69cd19c49c13c80257b82aa6",
"tool_version": "estimator sha256:391d6ca5ea39; lizard 1.24.3; jscpd 4.0.5; profile five-star",
"tolerance": 0.01,
"overall": 4.21,
"overall_range": [
4.21,
4.32
],
"properties": {
"volume": null,
"duplication": 4.54,
"unit_size": 3.4,
"unit_complexity": 4.02,
"unit_interfacing": 3.14,
"module_coupling": 4.65,
"component_independence": 5.5,
"component_entanglement": 5.5
}
}
1 change: 1 addition & 0 deletions .procedure-code-baseline.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"count": 0}
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ LaunchPad supercharges the Nextcloud dashboard. Create multiple personalized wor

📚 **[Step-by-step tutorials](https://launchpad.conduction.nl/docs/category/tutorials)** — user + admin walkthroughs with screenshots, kept in sync with the live UI via the [journeydoc](https://github.com/ConductionNL/hydra/blob/development/openspec/architecture/adr-030-journeydoc-pattern.md) capture spec.

## Test coverage

<!-- coverage:start -->
Measured test coverage: 81.0% of statements (PHP 81.0% of 21,952 statements), at commit `b3fd2179` on 2026-11-11. The JavaScript frontend is not in this figure, because it has no coverage measurement yet. The figures come from [`coverage-summary.json`](coverage-summary.json); refresh them with `composer coverage:publish`.
<!-- coverage:end -->

## Screenshots

<table>
Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ curl -sL https://github.com/ConductionNL/launchpad/releases/download/v1.0.0/sbom

### Update cadence

A new SBOM is generated and attached on every release tag. We do not commit SBOMs into the repository tree — they are published exclusively as release assets to keep main-branch history clean and to guarantee every SBOM corresponds to an immutable release artifact.
A new SBOM is generated and attached on every release tag. The `sbom.cdx.json` at the repository root is a snapshot of the dependencies on the `development` branch. For an SBOM that matches an immutable release, use the release assets above.

### Format

Expand Down
Loading