From 20f9df2d682ee3ce383be9114c04922df3c674d8 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Wed, 1 Jul 2026 08:04:05 +0200 Subject: [PATCH 001/313] chore(deps): bump @conduction/nextcloud-vue to ^1.0.0-beta.144 Picks up the dist-CSS :deep() lowering fix so scoped rules (e.g. the OpenBuild edit button's orange accent) render in dist-built consumers. --- package-lock.json | 168 +++++++++++++++++++++++++++++----------------- package.json | 2 +- 2 files changed, 108 insertions(+), 62 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe1ef5952..7cca4df43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "license": "EUPL-1.2", "dependencies": { - "@conduction/nextcloud-vue": "^1.0.0-beta.101", + "@conduction/nextcloud-vue": "^1.0.0-beta.144", "@nextcloud/axios": "~2.5.2", "@nextcloud/dialogs": "^3.2.0", "@nextcloud/initial-state": "^2.2.0", @@ -555,9 +555,9 @@ } }, "node_modules/@conduction/nextcloud-vue": { - "version": "1.0.0-beta.101", - "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-1.0.0-beta.101.tgz", - "integrity": "sha512-UVxKWUU7pf6oHr7Oly5HWPC1e8OK3z2lmdS5xgs28+sYZPNj53co9+xs3tb0mqCGXZ8Oqit9NMapI8ir0fy2iA==", + "version": "1.0.0-beta.144", + "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-1.0.0-beta.144.tgz", + "integrity": "sha512-9UiubvnC5V9O+zM/inMBY4ILekQM+jr2J2gtHGzaGEFhpLjVNBXuL1v5fI0xYE5usQBaIhRdWziDux+p02b9AA==", "license": "EUPL-1.2", "dependencies": { "@codemirror/autocomplete": "^6.0.0", @@ -573,10 +573,9 @@ "@microsoft/fetch-event-source": "^2.0.1", "@nextcloud/dialogs": "^6.4.2", "@nextcloud/event-bus": "^3.3.3", - "@nextcloud/notify_push": "^1.0.0", + "@nextcloud/notify_push": "^1.4.0", "@types/react": "^18.0.0", "@uiw/codemirror-theme-github": "^4.25.8", - "@vueuse/core": "^10.0.0", "ajv": "^8.20.0", "ajv-formats": "^3.0.1", "apexcharts": "^4.7.0", @@ -587,12 +586,13 @@ "leaflet.markercluster": "^1.5.3", "linkifyjs": "^4.3.3", "lodash": "^4.17.21", - "marked": "^15.0.0", + "marked": "^12.0.0", "style-mod": "^4.0.0", "vue-apexcharts": "^1.7.0", "vue-codemirror6": "^1.4.3", "vue-color": "^2.8.2", - "vue-template-compiler": "^2.7.16" + "vue-template-compiler": "^2.7.16", + "vuedraggable": "^2.24.3" }, "bin": { "manifest-migrate": "src/cli/manifest-migrate.js" @@ -601,13 +601,29 @@ "@nextcloud/auth": "^2.0.0 || ^3.0.0", "@nextcloud/axios": "^2.0.0", "@nextcloud/capabilities": "^1.2.1", + "@nextcloud/initial-state": "^2.2.0", "@nextcloud/l10n": "^2.0.0 || ^3.0.0", "@nextcloud/router": "^2.0.0 || ^3.0.0", "@nextcloud/vue": "^8.0.0", + "@vueuse/core": "^10.0.0", + "dexie": "^4.0.8", + "dompurify": "^3.0.0", + "marked": "^12.0.0", "pinia": "^2.0.0", "vue": "^2.7.0", "vue-frag": "^1.4.3", "vue-material-design-icons": "^5.0.0" + }, + "peerDependenciesMeta": { + "dexie": { + "optional": true + }, + "dompurify": { + "optional": true + }, + "marked": { + "optional": true + } } }, "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs": { @@ -667,18 +683,6 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/@vueuse/shared": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.3.0.tgz", - "integrity": "sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==", - "license": "MIT", - "dependencies": { - "vue-demi": ">=0.14.10" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/files": { "version": "3.12.2", "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-3.12.2.tgz", @@ -754,42 +758,6 @@ "@nextcloud/files": "^3.12.0" } }, - "node_modules/@conduction/nextcloud-vue/node_modules/@vueuse/core": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", - "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.11.1", - "@vueuse/shared": "10.11.1", - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@conduction/nextcloud-vue/node_modules/@vueuse/metadata": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", - "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@conduction/nextcloud-vue/node_modules/@vueuse/shared": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", - "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", - "license": "MIT", - "dependencies": { - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/@conduction/nextcloud-vue/node_modules/p-queue": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.0.tgz", @@ -2907,6 +2875,30 @@ "node": "^20.0.0 || ^22.0.0 || ^24.0.0" } }, + "node_modules/@nextcloud/vue/node_modules/@vueuse/core": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.3.0.tgz", + "integrity": "sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "11.3.0", + "@vueuse/shared": "11.3.0", + "vue-demi": ">=0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@nextcloud/vue/node_modules/@vueuse/metadata": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.3.0.tgz", + "integrity": "sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@nextcloud/webpack-vue-config": { "version": "6.3.2", "resolved": "https://registry.npmjs.org/@nextcloud/webpack-vue-config/-/webpack-vue-config-6.3.2.tgz", @@ -5011,7 +5003,7 @@ "vue-demi": ">=0.14.10" } }, - "node_modules/@vueuse/core": { + "node_modules/@vueuse/components/node_modules/@vueuse/core": { "version": "11.3.0", "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.3.0.tgz", "integrity": "sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==", @@ -5026,7 +5018,7 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@vueuse/metadata": { + "node_modules/@vueuse/components/node_modules/@vueuse/metadata": { "version": "11.3.0", "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.3.0.tgz", "integrity": "sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==", @@ -5035,6 +5027,45 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@vueuse/core": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", + "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.11.1", + "@vueuse/shared": "10.11.1", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/@vueuse/shared": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", + "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", + "license": "MIT", + "peer": true, + "dependencies": { + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", + "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@vueuse/shared": { "version": "11.3.0", "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.3.0.tgz", @@ -12219,9 +12250,9 @@ } }, "node_modules/marked": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", - "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", + "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -16892,6 +16923,12 @@ "node": ">= 14" } }, + "node_modules/sortablejs": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz", + "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==", + "license": "MIT" + }, "node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", @@ -19448,6 +19485,15 @@ "vue": "^2.5.0" } }, + "node_modules/vuedraggable": { + "version": "2.24.3", + "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz", + "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==", + "license": "MIT", + "dependencies": { + "sortablejs": "1.10.2" + } + }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", diff --git a/package.json b/package.json index b057a89cc..725ee7b62 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "extends @nextcloud/browserslist-config" ], "dependencies": { - "@conduction/nextcloud-vue": "^1.0.0-beta.101", + "@conduction/nextcloud-vue": "^1.0.0-beta.144", "@nextcloud/axios": "~2.5.2", "@nextcloud/dialogs": "^3.2.0", "@nextcloud/initial-state": "^2.2.0", From 6ae48b81b33a3e7633d1fa329deedbcbc06d0e01 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sun, 5 Jul 2026 20:04:20 +0200 Subject: [PATCH 002/313] ci: adopt canonical test workflow (node fix + consolidation) Standardizes the drifted tests.yml + pre-merge-check-strict.yaml onto the canonical version (php:8.3-cli + node20 install; fixes the 404 ci-php image; validated green on softwarecatalog/procest/docudesk). --- .../workflows/pre-merge-check-strict.yaml | 4 +++ .forgejo/workflows/tests.yml | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/.forgejo/workflows/pre-merge-check-strict.yaml b/.forgejo/workflows/pre-merge-check-strict.yaml index bb09a6fb6..863f2b03e 100644 --- a/.forgejo/workflows/pre-merge-check-strict.yaml +++ b/.forgejo/workflows/pre-merge-check-strict.yaml @@ -32,6 +32,10 @@ jobs: apt-get install -y --no-install-recommends \ git curl ca-certificates gnupg jq unzip zip \ libzip-dev libpng-dev python3 + # Node is required by actions/checkout@v4 (a JS action) which runs + # inside this php:8.3-cli container; the stock image ships no node. + curl -fsSL https://deb.nodesource.com/setup_20.x | bash - + apt-get install -y --no-install-recommends nodejs docker-php-ext-install -j"$(nproc)" zip gd curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer diff --git a/.forgejo/workflows/tests.yml b/.forgejo/workflows/tests.yml index 8080caba0..f6d766858 100644 --- a/.forgejo/workflows/tests.yml +++ b/.forgejo/workflows/tests.yml @@ -75,6 +75,10 @@ jobs: apt-get install -y --no-install-recommends \ git curl ca-certificates gnupg jq unzip zip \ libzip-dev libpng-dev python3 + # Node is required by actions/checkout@v4 (a JS action) which runs + # inside this php:8.3-cli container; the stock image ships no node. + curl -fsSL https://deb.nodesource.com/setup_20.x | bash - + apt-get install -y --no-install-recommends nodejs docker-php-ext-install -j"$(nproc)" zip gd curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer @@ -105,6 +109,30 @@ jobs: - name: Assert every t() source string is in l10n/en.json run: node tests/l10n/check-l10n.js + # --------------------------------------------------------------------------- + # HARD GATE 3 — frontend unit suite (Vitest, OFFLINE; no NC needed). + # + # Runs the pure-logic Vitest suite under tests/vitest/** (Pinia store + # state transitions, util/formatter calc, form-validation mappers, and any + # offline component mounts). These need no DOM/NC runtime — @nextcloud/* and + # @conduction/nextcloud-vue are aliased to deterministic stubs in + # vitest.config.js. Always gating. + # --------------------------------------------------------------------------- + frontend-unit: + name: Frontend unit (Vitest — ${{ inputs.app-id }}) + runs-on: codeberg-medium + container: + image: node:${{ inputs.node-version }} + steps: + - name: Checkout + uses: https://github.com/actions/checkout@v4 + + - name: Install npm deps + run: npm ci --legacy-peer-deps || npm install --legacy-peer-deps + + - name: Run Vitest unit suite + run: npm run test:unit + # --------------------------------------------------------------------------- # COVERAGE GATE A — PHPUnit COVERAGE RATCHET (PCOV clover line coverage). # Fails a PR that drops backend coverage below tests/.coverage-baseline.json @@ -125,6 +153,10 @@ jobs: apt-get install -y --no-install-recommends \ git curl ca-certificates gnupg jq unzip zip \ libzip-dev libpng-dev python3 + # Node is required by actions/checkout@v4 (a JS action) which runs + # inside this php:8.3-cli container; the stock image ships no node. + curl -fsSL https://deb.nodesource.com/setup_20.x | bash - + apt-get install -y --no-install-recommends nodejs docker-php-ext-install -j"$(nproc)" zip gd curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer From 37d1a80923a4d5f6d213bb3e6a37ba87210ecae7 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 6 Jul 2026 07:37:09 +0200 Subject: [PATCH 003/313] feat(app): opt in to the AI-chat companion (:ai-companion="true" on CnAppRoot) Preserves the floating AI companion after nc-vue flips CnAiCompanion to opt-in (default off). Harmless on current nc-vue (unknown prop); activates on the next nc-vue rebuild. Fleet AI-companion opt-in sweep. --- src/App.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/App.vue b/src/App.vue index 2ecb1c396..d079edf79 100644 --- a/src/App.vue +++ b/src/App.vue @@ -28,6 +28,7 @@ -->