From dae5920ea54b4a4ad5e20d2b1901efa494ec3d8d Mon Sep 17 00:00:00 2001 From: "gitea-actions[bot]" Date: Thu, 18 Jun 2026 17:07:13 +0000 Subject: [PATCH 01/13] chore(release): build 02.22.00 [skip ci] --- .mokogitea/manifest.xml | 2 +- .mokogitea/workflows/issue-branch.yml | 2 +- CHANGELOG.md | 7 +++++-- SECURITY.md | 2 +- src/html/layouts/joomla/module/card.php | 2 +- src/html/layouts/mokoonyx/article-metadata.php | 2 +- src/media/css/a11y-high-contrast.css | 2 +- src/templateDetails.xml | 2 +- 8 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.mokogitea/manifest.xml b/.mokogitea/manifest.xml index eee73b3..f625280 100644 --- a/.mokogitea/manifest.xml +++ b/.mokogitea/manifest.xml @@ -9,7 +9,7 @@ Template - MokoOnyx MokoConsulting MokoOnyx - Joomla site template (successor to MokoCassiopeia) - 02.21.05 + 02.22.00 GNU General Public License v3 diff --git a/.mokogitea/workflows/issue-branch.yml b/.mokogitea/workflows/issue-branch.yml index 2953fdd..21bfe40 100644 --- a/.mokogitea/workflows/issue-branch.yml +++ b/.mokogitea/workflows/issue-branch.yml @@ -5,7 +5,7 @@ # FILE INFORMATION # DEFGROUP: Gitea.Workflow # INGROUP: moko-platform.Automation -# VERSION: 02.21.05 +# VERSION: 02.22.00 # BRIEF: Auto-create feature branch when an issue is opened name: "Universal: Issue Branch" diff --git a/CHANGELOG.md b/CHANGELOG.md index e1c5381..c20693c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,13 +8,16 @@ DEFGROUP: Joomla.Template.Site INGROUP: MokoOnyx.Documentation PATH: ./CHANGELOG.md - VERSION: 02.21.05 + VERSION: 02.22.00 BRIEF: Changelog file documenting version history of MokoOnyx --> -# Changelog — MokoOnyx (VERSION: 02.21.05) +# Changelog — MokoOnyx (VERSION: 02.22.00) + ## [Unreleased] +## [02.22.00] --- 2026-06-18 + ### Fixed - Strip Joomla-injected `p-2` padding class from Font Awesome icons in all menu overrides (default, mainmenu, horizontal) diff --git a/SECURITY.md b/SECURITY.md index 6bb2d20..ca0e486 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -10,7 +10,7 @@ INGROUP: MokoOnyx.Governance REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx FILE: SECURITY.md - VERSION: 02.21.05 + VERSION: 02.22.00 BRIEF: Security policy and vulnerability reporting process for MokoOnyx. PATH: /SECURITY.md NOTE: This policy is process oriented and does not replace secure engineering practices. diff --git a/src/html/layouts/joomla/module/card.php b/src/html/layouts/joomla/module/card.php index 424c04e..c37749d 100644 --- a/src/html/layouts/joomla/module/card.php +++ b/src/html/layouts/joomla/module/card.php @@ -10,7 +10,7 @@ * INGROUP: MokoOnyx * REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx * PATH: /html/layouts/joomla/module/card.php - * VERSION: 02.21.05 + * VERSION: 02.22.00 * BRIEF: Custom card module chrome — renders module titles for all modules */ diff --git a/src/html/layouts/mokoonyx/article-metadata.php b/src/html/layouts/mokoonyx/article-metadata.php index 50e93e2..e3c414d 100644 --- a/src/html/layouts/mokoonyx/article-metadata.php +++ b/src/html/layouts/mokoonyx/article-metadata.php @@ -11,7 +11,7 @@ * INGROUP: MokoOnyx.Layouts * REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx * PATH: /src/html/layouts/mokoonyx/article-metadata.php - * VERSION: 02.21.05 + * VERSION: 02.22.00 * BRIEF: Article metadata footer layout -- renders jcfields grouped by field group */ diff --git a/src/media/css/a11y-high-contrast.css b/src/media/css/a11y-high-contrast.css index 3616490..279f8cc 100644 --- a/src/media/css/a11y-high-contrast.css +++ b/src/media/css/a11y-high-contrast.css @@ -10,7 +10,7 @@ * INGROUP: MokoOnyx.Accessibility * REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx * PATH: ./media/css/a11y-high-contrast.css - * VERSION: 02.21.05 + * VERSION: 02.22.00 * BRIEF: High-contrast stylesheet for accessibility toolbar */ diff --git a/src/templateDetails.xml b/src/templateDetails.xml index 3369eb9..8a15b21 100644 --- a/src/templateDetails.xml +++ b/src/templateDetails.xml @@ -35,7 +35,7 @@ mokoonyx - 02.21.05-dev + 02.22.00 script.php 2026-05-16 Jonathan Miller || Moko Consulting -- 2.52.0 From abd35e95fa1341d2e23397cb28dc91df4eec4a18 Mon Sep 17 00:00:00 2001 From: Jonathan Miller <1+jmiller@noreply.git.mokoconsulting.tech> Date: Fri, 19 Jun 2026 00:43:15 +0000 Subject: [PATCH 02/13] ci: patch bump on same-branch rebuilds, minor only on elevation [skip ci] --- .mokogitea/workflows/pre-release.yml | 86 ++++++++++++---------------- 1 file changed, 36 insertions(+), 50 deletions(-) diff --git a/.mokogitea/workflows/pre-release.yml b/.mokogitea/workflows/pre-release.yml index 24c47e0..84ce1ff 100644 --- a/.mokogitea/workflows/pre-release.yml +++ b/.mokogitea/workflows/pre-release.yml @@ -4,26 +4,23 @@ # # FILE INFORMATION # DEFGROUP: Gitea.Workflow -# INGROUP: moko-platform.Release -# REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform +# INGROUP: mokoplatform.Release +# REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform # PATH: /templates/workflows/universal/pre-release.yml.template # VERSION: 05.01.00 -# BRIEF: Auto pre-release on push to dev/alpha/beta/rc branches +# BRIEF: Manual pre-release -- builds dev/alpha/beta/rc packages from any branch name: "Universal: Pre-Release" on: - push: + pull_request: + types: [closed] branches: - dev - - 'fix/**' - - 'patch/**' - - 'hotfix/**' - - 'bugfix/**' - - 'chore/**' - - alpha - - beta - - rc + pull_request_target: + types: [synchronize, opened, reopened] + branches: + - main workflow_dispatch: inputs: stability: @@ -46,11 +43,12 @@ env: jobs: build: - name: "Build Pre-Release (${{ inputs.stability || github.ref_name }})" + name: "Build Pre-Release (${{ inputs.stability || 'development' }})" runs-on: release if: >- github.event_name == 'workflow_dispatch' || - github.event_name == 'push' + (github.event_name == 'pull_request' && github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'dev') || + (github.event_name == 'pull_request_target' && github.event.pull_request.base.ref == 'main') steps: - name: Checkout @@ -58,47 +56,38 @@ jobs: with: fetch-depth: 0 token: ${{ secrets.MOKOGITEA_TOKEN }} - ref: ${{ github.ref_name }} + ref: ${{ github.event_name == 'pull_request_target' && github.event.pull_request.head.sha || '' }} - - name: Setup moko-platform tools + - name: Setup mokoplatform tools env: MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }} MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting run: | - # Use pre-installed /opt/moko-platform if available (updated by cron every 6h) - if [ -f /opt/moko-platform/cli/version_bump.php ] && [ -f /opt/moko-platform/cli/manifest_element.php ] && [ -f /opt/moko-platform/vendor/autoload.php ]; then - echo Using pre-installed /opt/moko-platform - echo MOKO_CLI=/opt/moko-platform/cli >> $GITHUB_ENV + if [ -f /opt/mokoplatform/cli/version_bump.php ] && [ -f /opt/mokoplatform/cli/manifest_element.php ] && [ -f /opt/mokoplatform/vendor/autoload.php ]; then + echo Using pre-installed /opt/mokoplatform + echo MOKO_CLI=/opt/mokoplatform/cli >> $GITHUB_ENV else echo Falling back to fresh clone if ! command -v composer > /dev/null 2>&1; then sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer > /dev/null 2>&1 fi - rm -rf /tmp/moko-platform-api - CLONE_URL=https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git - git clone --depth 1 --branch main --quiet $CLONE_URL /tmp/moko-platform-api - cd /tmp/moko-platform-api && composer install --no-dev --no-interaction --quiet - echo MOKO_CLI=/tmp/moko-platform-api/cli >> $GITHUB_ENV + rm -rf /tmp/mokoplatform-api + CLONE_URL=https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/mokoplatform.git + git clone --depth 1 --branch main --quiet $CLONE_URL /tmp/mokoplatform-api + cd /tmp/mokoplatform-api && composer install --no-dev --no-interaction --quiet + echo MOKO_CLI=/tmp/mokoplatform-api/cli >> $GITHUB_ENV fi - name: Detect platform id: platform run: | - # Auto-detect and update platform if not set in manifest - php ${MOKO_CLI}/platform_detect.php --path . --github-output 2>/dev/null || true php ${MOKO_CLI}/manifest_read.php --path . --github-output - name: Resolve metadata and bump version id: meta run: | - # Auto-detect stability from branch name on push, or use input on dispatch - if [ "${{ github.event_name }}" = "push" ]; then - case "${{ github.ref_name }}" in - rc) STABILITY="release-candidate" ;; - alpha) STABILITY="alpha" ;; - beta) STABILITY="beta" ;; - *) STABILITY="development" ;; - esac + if [ "${{ github.event_name }}" = "pull_request_target" ] && [ "${{ github.event.pull_request.base.ref }}" = "main" ]; then + STABILITY="release-candidate" else STABILITY="${{ inputs.stability || 'development' }}" fi @@ -110,15 +99,22 @@ jobs: release-candidate) SUFFIX="-rc"; TAG="release-candidate" ;; esac - # Bump version via CLI: patch for dev/alpha/beta, minor for RC + CURRENT=$(php ${MOKO_CLI}/version_read.php --path . 2>/dev/null || echo "00.00.00") case "$STABILITY" in - release-candidate) BUMP="minor" ;; - *) BUMP="patch" ;; + release-candidate) + if echo "$CURRENT" | grep -q '\-rc$'; then + BUMP="patch" + else + BUMP="minor" + fi + ;; + *) + BUMP="patch" + ;; esac php ${MOKO_CLI}/version_bump.php --path . $([ "$BUMP" = "minor" ] && echo "--minor") 2>/dev/null || true - # Set stability suffix and verify consistency VERSION=$(php ${MOKO_CLI}/version_read.php --path . 2>/dev/null || echo "00.00.01") VERSION=$(echo "$VERSION" | sed 's/-\(dev\|alpha\|beta\|rc\)$//') @@ -126,15 +122,12 @@ jobs: --path . --version "$VERSION" --branch "${{ github.ref_name }}" --stability "$STABILITY" 2>/dev/null || true php ${MOKO_CLI}/version_check.php --path . --fix 2>/dev/null || true - # Ensure licensing tags (updateservers, dlid) if enabled in manifest.xml php ${MOKO_CLI}/manifest_licensing.php --path . --fix 2>/dev/null || true - # Append suffix for output if [ -n "$SUFFIX" ]; then VERSION="${VERSION}${SUFFIX}" fi - # Commit version bump git config --local user.email "gitea-actions[bot]@mokoconsulting.tech" git config --local user.name "gitea-actions[bot]" git remote set-url origin "https://x-access-token:${{ secrets.MOKOGITEA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git" @@ -144,12 +137,10 @@ jobs: git push origin HEAD 2>&1 } - # Auto-detect element via manifest_element.php php ${MOKO_CLI}/manifest_element.php \ --path . --version "$VERSION" --stability "$STABILITY" \ --repo "${GITEA_REPO}" --github-output - # Read back element outputs EXT_ELEMENT=$(grep '^ext_element=' "$GITHUB_OUTPUT" | tail -1 | cut -d= -f2) ZIP_NAME=$(grep '^zip_name=' "$GITHUB_OUTPUT" | tail -1 | cut -d= -f2) [ -z "$EXT_ELEMENT" ] && EXT_ELEMENT=$(echo "${GITEA_REPO}" | tr '[:upper:]' '[:lower:]' | tr -d ' -') @@ -173,7 +164,7 @@ jobs: php ${MOKO_CLI}/release_create.php \ --path . --version "$VERSION" --tag "$TAG" \ --token "${{ secrets.MOKOGITEA_TOKEN }}" --api-base "$API_BASE" \ - --repo "${GITEA_REPO}" --branch "${{ github.ref_name }}" --prerelease + --repo "${GITEA_REPO}" --branch dev --prerelease - name: Update release notes from CHANGELOG.md run: | @@ -181,7 +172,6 @@ jobs: VERSION="${{ steps.meta.outputs.version }}" API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}" - # Extract [Unreleased] section from changelog (everything between [Unreleased] and next ## heading) if [ -f "CHANGELOG.md" ]; then NOTES=$(awk '/^## \[Unreleased\]/{found=1; next} /^## \[/{if(found) exit} found{print}' CHANGELOG.md) [ -z "$NOTES" ] && NOTES="Release ${VERSION}" @@ -189,7 +179,6 @@ jobs: NOTES="Release ${VERSION}" fi - # Update release body via API RELEASE_ID=$(curl -sf -H "Authorization: token ${{ secrets.MOKOGITEA_TOKEN }}" \ "${API_BASE}/releases/tags/${TAG}" | python3 -c "import json,sys; print(json.load(sys.stdin).get('id',''))" 2>/dev/null || true) @@ -221,9 +210,6 @@ jobs: --token "${{ secrets.MOKOGITEA_TOKEN }}" --api-base "$API_BASE" \ --repo "${GITEA_REPO}" --output /tmp || true - # updates.xml is generated dynamically by MokoGitea license server - # No need to build, commit, or sync updates.xml from workflows - - name: "Delete lesser pre-release channels (cascade)" continue-on-error: true run: | -- 2.52.0 From 9e3e511e6a037d370cf0f614d4d004b35af893ca Mon Sep 17 00:00:00 2001 From: Jonathan Miller <1+jmiller@noreply.git.mokoconsulting.tech> Date: Fri, 19 Jun 2026 01:57:33 +0000 Subject: [PATCH 03/13] fix(ci): detect rebuild by branch name not version suffix [skip ci] --- .mokogitea/workflows/pre-release.yml | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/.mokogitea/workflows/pre-release.yml b/.mokogitea/workflows/pre-release.yml index 84ce1ff..ec424e6 100644 --- a/.mokogitea/workflows/pre-release.yml +++ b/.mokogitea/workflows/pre-release.yml @@ -63,6 +63,7 @@ jobs: MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }} MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting run: | + # Use pre-installed /opt/mokoplatform if available (updated by cron every 6h) if [ -f /opt/mokoplatform/cli/version_bump.php ] && [ -f /opt/mokoplatform/cli/manifest_element.php ] && [ -f /opt/mokoplatform/vendor/autoload.php ]; then echo Using pre-installed /opt/mokoplatform echo MOKO_CLI=/opt/mokoplatform/cli >> $GITHUB_ENV @@ -86,6 +87,7 @@ jobs: - name: Resolve metadata and bump version id: meta run: | + # Auto-detect stability: RC for PRs targeting main, else use input or default to development if [ "${{ github.event_name }}" = "pull_request_target" ] && [ "${{ github.event.pull_request.base.ref }}" = "main" ]; then STABILITY="release-candidate" else @@ -99,10 +101,12 @@ jobs: release-candidate) SUFFIX="-rc"; TAG="release-candidate" ;; esac - CURRENT=$(php ${MOKO_CLI}/version_read.php --path . 2>/dev/null || echo "00.00.00") + # Bump version: minor only on branch elevation, patch for rebuilds + # Check branch name — if already on the target stability branch, it's a rebuild + BRANCH="${{ github.ref_name }}" case "$STABILITY" in release-candidate) - if echo "$CURRENT" | grep -q '\-rc$'; then + if [ "$BRANCH" = "rc" ]; then BUMP="patch" else BUMP="minor" @@ -115,6 +119,7 @@ jobs: php ${MOKO_CLI}/version_bump.php --path . $([ "$BUMP" = "minor" ] && echo "--minor") 2>/dev/null || true + # Set stability suffix and verify consistency VERSION=$(php ${MOKO_CLI}/version_read.php --path . 2>/dev/null || echo "00.00.01") VERSION=$(echo "$VERSION" | sed 's/-\(dev\|alpha\|beta\|rc\)$//') @@ -122,12 +127,15 @@ jobs: --path . --version "$VERSION" --branch "${{ github.ref_name }}" --stability "$STABILITY" 2>/dev/null || true php ${MOKO_CLI}/version_check.php --path . --fix 2>/dev/null || true + # Ensure licensing tags (updateservers, dlid) if enabled in manifest.xml php ${MOKO_CLI}/manifest_licensing.php --path . --fix 2>/dev/null || true + # Append suffix for output if [ -n "$SUFFIX" ]; then VERSION="${VERSION}${SUFFIX}" fi + # Commit version bump git config --local user.email "gitea-actions[bot]@mokoconsulting.tech" git config --local user.name "gitea-actions[bot]" git remote set-url origin "https://x-access-token:${{ secrets.MOKOGITEA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git" @@ -137,10 +145,12 @@ jobs: git push origin HEAD 2>&1 } + # Auto-detect element via manifest_element.php php ${MOKO_CLI}/manifest_element.php \ --path . --version "$VERSION" --stability "$STABILITY" \ --repo "${GITEA_REPO}" --github-output + # Read back element outputs EXT_ELEMENT=$(grep '^ext_element=' "$GITHUB_OUTPUT" | tail -1 | cut -d= -f2) ZIP_NAME=$(grep '^zip_name=' "$GITHUB_OUTPUT" | tail -1 | cut -d= -f2) [ -z "$EXT_ELEMENT" ] && EXT_ELEMENT=$(echo "${GITEA_REPO}" | tr '[:upper:]' '[:lower:]' | tr -d ' -') @@ -172,6 +182,7 @@ jobs: VERSION="${{ steps.meta.outputs.version }}" API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}" + # Extract [Unreleased] section from changelog (everything between [Unreleased] and next ## heading) if [ -f "CHANGELOG.md" ]; then NOTES=$(awk '/^## \[Unreleased\]/{found=1; next} /^## \[/{if(found) exit} found{print}' CHANGELOG.md) [ -z "$NOTES" ] && NOTES="Release ${VERSION}" @@ -179,6 +190,7 @@ jobs: NOTES="Release ${VERSION}" fi + # Update release body via API RELEASE_ID=$(curl -sf -H "Authorization: token ${{ secrets.MOKOGITEA_TOKEN }}" \ "${API_BASE}/releases/tags/${TAG}" | python3 -c "import json,sys; print(json.load(sys.stdin).get('id',''))" 2>/dev/null || true) @@ -210,6 +222,9 @@ jobs: --token "${{ secrets.MOKOGITEA_TOKEN }}" --api-base "$API_BASE" \ --repo "${GITEA_REPO}" --output /tmp || true + # updates.xml is generated dynamically by MokoGitea license server + # No need to build, commit, or sync updates.xml from workflows + - name: "Delete lesser pre-release channels (cascade)" continue-on-error: true run: | -- 2.52.0 From d8b4d10e442c1f7637c0362a6482422a838e0cec Mon Sep 17 00:00:00 2001 From: Jonathan Miller <1+jmiller@noreply.git.mokoconsulting.tech> Date: Fri, 19 Jun 2026 07:11:54 +0000 Subject: [PATCH 04/13] chore: sync auto-bump.yml from Template-Joomla [skip ci] --- .mokogitea/workflows/auto-bump.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.mokogitea/workflows/auto-bump.yml b/.mokogitea/workflows/auto-bump.yml index 34953b1..44a28e0 100644 --- a/.mokogitea/workflows/auto-bump.yml +++ b/.mokogitea/workflows/auto-bump.yml @@ -15,7 +15,6 @@ name: "Universal: Auto Version Bump" on: push: branches: - - dev - rc - 'feature/**' - 'patch/**' -- 2.52.0 From cf04f9687b32445f75f023f6abca2cfcc199abad Mon Sep 17 00:00:00 2001 From: Jonathan Miller <1+jmiller@noreply.git.mokoconsulting.tech> Date: Fri, 19 Jun 2026 07:11:55 +0000 Subject: [PATCH 05/13] chore: sync auto-release.yml from Template-Joomla [skip ci] --- .mokogitea/workflows/auto-release.yml | 471 ++++++++------------------ 1 file changed, 147 insertions(+), 324 deletions(-) diff --git a/.mokogitea/workflows/auto-release.yml b/.mokogitea/workflows/auto-release.yml index ca40435..f529cac 100644 --- a/.mokogitea/workflows/auto-release.yml +++ b/.mokogitea/workflows/auto-release.yml @@ -1,324 +1,147 @@ -# Copyright (C) 2026 Moko Consulting -# -# SPDX-License-Identifier: GPL-3.0-or-later -# -# FILE INFORMATION -# DEFGROUP: Gitea.Workflow -# INGROUP: moko-platform.Release -# REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/moko-platform -# PATH: /templates/workflows/universal/auto-release.yml.template -# VERSION: 05.00.00 -# BRIEF: Universal build & release � detects platform from manifest.xml -# -# +========================================================================+ -# | UNIVERSAL BUILD & RELEASE PIPELINE | -# +========================================================================+ -# | | -# | Reads manifest.xml (joomla|dolibarr|generic) to branch logic. | -# | | -# | Platform-specific: | -# | joomla: XML manifest, type-prefixed packages | -# | dolibarr: mod*.class.php, update.txt, dev version reset | -# | generic: README-only, no update stream | -# | | -# +========================================================================+ - -name: "Universal: Build & Release" - -on: - pull_request: - types: [opened, closed] - branches: - - main - workflow_dispatch: - inputs: - action: - description: 'Action to perform' - required: false - type: choice - default: release - options: - - release - - promote-rc - -env: - FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true - GITEA_URL: ${{ vars.GITEA_URL || 'https://git.mokoconsulting.tech' }} - GITEA_ORG: ${{ vars.GITEA_ORG || github.repository_owner }} - GITEA_REPO: ${{ vars.GITEA_REPO || github.event.repository.name }} - -permissions: - contents: write - -jobs: - # ── PR Opened → Rename branch to RC and build RC release ───────────────────── - promote-rc: - name: Promote to RC - runs-on: release - if: >- - (github.event.action == 'opened' && github.event.pull_request.merged != true) || - (github.event_name == 'workflow_dispatch' && inputs.action == 'promote-rc') - - steps: - - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - with: - token: ${{ secrets.MOKOGITEA_TOKEN }} - fetch-depth: 1 - - - name: Setup moko-platform tools - env: - MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }} - MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting - run: | - if [ -f /opt/moko-platform/cli/version_bump.php ] && [ -f /opt/moko-platform/vendor/autoload.php ]; then - echo Using pre-installed /opt/moko-platform - echo MOKO_CLI=/opt/moko-platform/cli >> $GITHUB_ENV - else - echo Falling back to fresh clone - if ! command -v composer > /dev/null 2>&1; then - sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer > /dev/null 2>&1 - fi - rm -rf /tmp/moko-platform-api - CLONE_URL=https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git - git clone --depth 1 --branch main --quiet $CLONE_URL /tmp/moko-platform-api - cd /tmp/moko-platform-api - composer install --no-dev --no-interaction --quiet - echo MOKO_CLI=/tmp/moko-platform-api/cli >> $GITHUB_ENV - fi - - - name: Rename branch to rc - run: | - php ${MOKO_CLI}/branch_rename.php \ - --from "${{ github.event.pull_request.head.ref || 'dev' }}" --to rc \ - --token "${{ secrets.MOKOGITEA_TOKEN }}" \ - --api-base "${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}" \ - --pr "${{ github.event.pull_request.number }}" - - - name: Checkout rc and configure git - run: | - git fetch origin rc - git checkout rc - git config --local user.email "gitea-actions[bot]@mokoconsulting.tech" - git config --local user.name "gitea-actions[bot]" - git remote set-url origin "https://x-access-token:${{ secrets.MOKOGITEA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git" - - - name: Publish RC release - run: | - php ${MOKO_CLI}/release_publish.php \ - --path . --stability rc --bump minor --branch rc \ - --token "${{ secrets.MOKOGITEA_TOKEN }}" - - - name: Summary - if: always() - run: | - echo "## Promoted to Release Candidate" >> $GITHUB_STEP_SUMMARY - echo "Branch renamed to rc, minor bump, RC release built" >> $GITHUB_STEP_SUMMARY - - # ── Merged PR → Build & Release (or promote RC to stable) ──────────────────── - release: - name: Build & Release Pipeline - runs-on: release - if: >- - github.event.pull_request.merged == true || - (github.event_name == 'workflow_dispatch' && inputs.action != 'promote-rc') - - steps: - - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - with: - token: ${{ secrets.MOKOGITEA_TOKEN }} - fetch-depth: 0 - - - name: Configure git for bot pushes - run: | - git config --local user.email "gitea-actions[bot]@mokoconsulting.tech" - git config --local user.name "gitea-actions[bot]" - git remote set-url origin "https://x-access-token:${{ secrets.MOKOGITEA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git" - - - name: Check for merge conflict markers - run: | - CONFLICTS=$(grep -rn '<<<<<<< \|>>>>>>> \|^=======$' --include='*.php' --include='*.xml' --include='*.css' --include='*.js' --include='*.json' --include='*.md' --include='*.yml' --include='*.yaml' --include='*.ini' --include='*.txt' . 2>/dev/null | grep -v '.git/' || true) - if [ -n "$CONFLICTS" ]; then - echo "::error::Merge conflict markers found — aborting release" - echo "## Release Blocked: Conflict Markers" >> $GITHUB_STEP_SUMMARY - echo '```' >> $GITHUB_STEP_SUMMARY - echo "$CONFLICTS" >> $GITHUB_STEP_SUMMARY - echo '```' >> $GITHUB_STEP_SUMMARY - exit 1 - fi - echo "No conflict markers found" - - - name: Setup moko-platform tools - env: - MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }} - MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting - COMPOSER_AUTH: '{"github-oauth":{"github.com":"${{ secrets.GH_MIRROR_TOKEN }}"}}' - run: | - if [ -f /opt/moko-platform/cli/version_bump.php ] && [ -f /opt/moko-platform/vendor/autoload.php ]; then - echo Using pre-installed /opt/moko-platform - echo MOKO_CLI=/opt/moko-platform/cli >> $GITHUB_ENV - else - echo Falling back to fresh clone - if ! command -v composer > /dev/null 2>&1; then - sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer > /dev/null 2>&1 - fi - rm -rf /tmp/moko-platform-api - CLONE_URL=https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git - git clone --depth 1 --branch main --quiet $CLONE_URL /tmp/moko-platform-api - cd /tmp/moko-platform-api - composer install --no-dev --no-interaction --quiet - echo MOKO_CLI=/tmp/moko-platform-api/cli >> $GITHUB_ENV - fi - - - name: "Publish stable release" - run: | - php ${MOKO_CLI}/release_publish.php \ - --path . --stability stable --bump minor --branch main \ - --token "${{ secrets.MOKOGITEA_TOKEN }}" - - - name: Update release notes from CHANGELOG.md - run: | - API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}" - - # Extract [Unreleased] section from changelog - if [ -f "CHANGELOG.md" ]; then - NOTES=$(awk '/^## \[Unreleased\]/{found=1; next} /^## \[/{if(found) exit} found{print}' CHANGELOG.md) - [ -z "$NOTES" ] && NOTES="Stable release" - else - NOTES="Stable release" - fi - - # Update release body via API - RELEASE_ID=$(curl -sf -H "Authorization: token ${{ secrets.MOKOGITEA_TOKEN }}" \ - "${API_BASE}/releases/tags/stable" | python3 -c "import json,sys; print(json.load(sys.stdin).get('id',''))" 2>/dev/null || true) - - if [ -n "$RELEASE_ID" ]; then - python3 -c " - import json, urllib.request - body = open('/dev/stdin').read() - payload = json.dumps({'body': body}).encode() - req = urllib.request.Request( - '${API_BASE}/releases/${RELEASE_ID}', - data=payload, method='PATCH', - headers={ - 'Authorization': 'token ${{ secrets.MOKOGITEA_TOKEN }}', - 'Content-Type': 'application/json' - }) - urllib.request.urlopen(req) - " <<< "$NOTES" - echo "Release notes updated from CHANGELOG.md" - fi - - # -- STEP 9: Mirror to GitHub (stable only) -------------------------------- - - name: "Step 9: Mirror release to GitHub" - if: >- - steps.version.outputs.skip != 'true' && - secrets.GH_MIRROR_TOKEN != '' - continue-on-error: true - run: | - VERSION="${{ steps.bump.outputs.version || steps.version.outputs.version }}" - RELEASE_TAG="${{ steps.version.outputs.release_tag }}" - GH_REPO="${{ vars.GH_MIRROR_REPO || github.repository }}" - API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}" - php ${MOKO_CLI}/release_mirror.php \ - --version "$VERSION" --tag "$RELEASE_TAG" \ - --token "${{ secrets.MOKOGITEA_TOKEN }}" --api-base "$API_BASE" \ - --gh-token "${{ secrets.GH_MIRROR_TOKEN }}" --gh-repo "$GH_REPO" \ - --branch main 2>&1 || true - echo "GitHub mirror updated" >> $GITHUB_STEP_SUMMARY - - # -- STEP 10: Sync main branch to GitHub mirror ---------------------------- - - name: "Step 10: Push main to GitHub mirror" - if: >- - steps.version.outputs.skip != 'true' && - secrets.GH_MIRROR_TOKEN != '' - continue-on-error: true - run: | - GH_REPO="${{ vars.GH_MIRROR_REPO || github.repository }}" - GH_ORG=$(echo "$GH_REPO" | cut -d/ -f1) - GH_NAME=$(echo "$GH_REPO" | cut -d/ -f2) - git remote add github "https://x-access-token:${{ secrets.GH_MIRROR_TOKEN }}@github.com/${GH_ORG}/${GH_NAME}.git" 2>/dev/null || \ - git remote set-url github "https://x-access-token:${{ secrets.GH_MIRROR_TOKEN }}@github.com/${GH_ORG}/${GH_NAME}.git" - git fetch origin main --depth=1 - git push github origin/main:refs/heads/main --force 2>/dev/null \ - && echo "main branch pushed to GitHub mirror" \ - || echo "WARNING: GitHub mirror push failed" - - - name: "Step 11: Delete rc branch and recreate dev from main" - if: steps.version.outputs.skip != 'true' - continue-on-error: true - run: | - API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}" - TOKEN="${{ secrets.MOKOGITEA_TOKEN }}" - - # Delete rc branch (ephemeral — created by promote-rc) - curl -sf -X DELETE -H "Authorization: token ${TOKEN}" \ - "${API_BASE}/branches/rc" 2>/dev/null \ - && echo "Deleted rc branch" || echo "rc branch not found" - - # Delete dev branch - curl -sf -X DELETE -H "Authorization: token ${TOKEN}" \ - "${API_BASE}/branches/dev" 2>/dev/null && echo "Deleted dev branch" - - # Recreate dev from main (now includes version bump + changelog promotion) - curl -sf -X POST -H "Authorization: token ${TOKEN}" \ - -H "Content-Type: application/json" \ - "${API_BASE}/branches" \ - -d '{"new_branch_name":"dev","old_branch_name":"main"}' 2>/dev/null && echo "Recreated dev from main" - - echo "Pre-release branches cleaned, dev reset from main" >> $GITHUB_STEP_SUMMARY - - - name: "Step 12: Create version branch from main" - if: steps.version.outputs.skip != 'true' - continue-on-error: true - run: | - API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}" - TOKEN="${{ secrets.MOKOGITEA_TOKEN }}" - VERSION="${{ steps.bump.outputs.version || steps.version.outputs.version }}" - BRANCH_NAME="version/${VERSION}" - MAIN_SHA=$(git rev-parse HEAD) - - # Delete old version branch if it exists (same version re-release) - curl -sf -X DELETE -H "Authorization: token ${TOKEN}" "${API_BASE}/branches/${BRANCH_NAME}" 2>/dev/null && echo "Deleted old ${BRANCH_NAME}" - - # Create version/XX.YY.ZZ from main - curl -sf -X POST -H "Authorization: token ${TOKEN}" -H "Content-Type: application/json" "${API_BASE}/branches" -d "{\"new_branch_name\":\"${BRANCH_NAME}\",\"old_branch_name\":\"main\"}" 2>/dev/null && echo "Created ${BRANCH_NAME} from main (${MAIN_SHA})" || echo "WARNING: ${BRANCH_NAME} creation failed" - - echo "Version branch created: ${BRANCH_NAME} (${MAIN_SHA})" >> $GITHUB_STEP_SUMMARY - - - - # -- Dolibarr post-release: Reset dev version ----------------------------- - - name: "Post-release: Reset dev version" - if: steps.version.outputs.skip != 'true' - continue-on-error: true - run: | - API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}" - php ${MOKO_CLI}/version_reset_dev.php \ - --token "${{ secrets.MOKOGITEA_TOKEN }}" --api-base "${API_BASE}" \ - --branch dev --path . 2>&1 || true - - # -- Summary -------------------------------------------------------------- - - name: Pipeline Summary - if: always() - run: | - VERSION="${{ steps.bump.outputs.version || steps.version.outputs.version }}" - PLATFORM="${{ steps.platform.outputs.platform }}" - if [ "${{ steps.version.outputs.skip }}" = "true" ]; then - echo "## Release Skipped" >> $GITHUB_STEP_SUMMARY - echo "No VERSION in README.md" >> $GITHUB_STEP_SUMMARY - elif [ "${{ steps.check.outputs.already_released }}" = "true" ]; then - echo "## Already Released — ${VERSION}" >> $GITHUB_STEP_SUMMARY - else - echo "" >> $GITHUB_STEP_SUMMARY - echo "## Build & Release Complete (${PLATFORM})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Step | Result |" >> $GITHUB_STEP_SUMMARY - echo "|------|--------|" >> $GITHUB_STEP_SUMMARY - echo "| Platform | \`${PLATFORM}\` |" >> $GITHUB_STEP_SUMMARY - echo "| Version | \`${VERSION}\` |" >> $GITHUB_STEP_SUMMARY - echo "| Branch | \`${{ steps.version.outputs.branch }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| Tag | \`${{ steps.version.outputs.tag }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| Release | [View](${GITEA_URL}/${GITEA_ORG}/${GITEA_REPO}/releases/tag/${{ steps.version.outputs.tag }}) |" >> $GITHUB_STEP_SUMMARY - fi +# Copyright (C) 2026 Moko Consulting +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +# FILE INFORMATION +# DEFGROUP: Gitea.Workflow +# INGROUP: moko-platform.Release +# REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/moko-platform +# PATH: /templates/workflows/universal/auto-release.yml.template +# VERSION: 05.00.00 +# BRIEF: Universal build & release � detects platform from manifest.xml +# +# +========================================================================+ +# | UNIVERSAL BUILD & RELEASE PIPELINE | +# +========================================================================+ +# | | +# | Reads manifest.xml (joomla|dolibarr|generic) to branch logic. | +# | | +# | Platform-specific: | +# | joomla: XML manifest, type-prefixed packages | +# | dolibarr: mod*.class.php, update.txt, dev version reset | +# | generic: README-only, no update stream | +# | | +# +========================================================================+ + +name: "Universal: Build & Release" + +on: + pull_request: + types: [opened, closed] + branches: + - main + workflow_dispatch: + inputs: + action: + description: 'Action to perform' + required: false + type: choice + default: release + options: + - release + - promote-rc + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + GITEA_URL: ${{ vars.GITEA_URL || 'https://git.mokoconsulting.tech' }} + GITEA_ORG: ${{ vars.GITEA_ORG || github.repository_owner }} + GITEA_REPO: ${{ vars.GITEA_REPO || github.event.repository.name }} + +permissions: + contents: write + +jobs: + # ── PR Opened → Rename branch to RC and build RC release ───────────────────── + promote-rc: + name: Promote to RC + runs-on: release + if: >- + (github.event.action == 'opened' && github.event.pull_request.merged != true) || + (github.event_name == 'workflow_dispatch' && inputs.action == 'promote-rc') + + steps: + - name: Checkout repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + token: ${{ secrets.MOKOGITEA_TOKEN }} + fetch-depth: 1 + + - name: Setup moko-platform tools + env: + MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }} + MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting + run: | + if [ -f /opt/moko-platform/cli/version_bump.php ] && [ -f /opt/moko-platform/vendor/autoload.php ]; then + echo Using pre-installed /opt/moko-platform + echo MOKO_CLI=/opt/moko-platform/cli >> $GITHUB_ENV + else + echo Falling back to fresh clone + if ! command -v composer > /dev/null 2>&1; then + sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer > /dev/null 2>&1 + fi + rm -rf /tmp/moko-platform-api + CLONE_URL=https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git + git clone --depth 1 --branch main --quiet $CLONE_URL /tmp/moko-platform-api + cd /tmp/moko-platform-api + composer install --no-dev --no-interaction --quiet + echo MOKO_CLI=/tmp/moko-platform-api/cli >> $GITHUB_ENV + fi + + - name: Rename branch to rc + run: | + php ${MOKO_CLI}/branch_rename.php \ + --from "${{ github.event.pull_request.head.ref || 'dev' }}" --to rc \ + --token "${{ secrets.MOKOGITEA_TOKEN }}" \ + --api-base "${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}" \ + --pr "${{ github.event.pull_request.number }}" + + - name: Checkout rc and configure git + run: | + git fetch origin rc + git checkout rc + git config --local user.email "gitea-actions[bot]@mokoconsulting.tech" + git config --local user.name "gitea-actions[bot]" + git remote set-url origin "https://x-access-token:${{ secrets.MOKOGITEA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git" + + - name: Publish RC release + run: | + php ${MOKO_CLI}/release_publish.php \ + --path . --stability rc --bump minor --branch rc \ + --token "${{ secrets.MOKOGITEA_TOKEN }}" + + - name: Update RC release notes from CHANGELOG.md + run: | + API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}" + + if [ -f "CHANGELOG.md" ]; then + NOTES=$(awk '/^## \[Unreleased\]/{found=1; next} /^## \[/{if(found) exit} found{print}' CHANGELOG.md) + [ -z "$NOTES" ] && NOTES="Release candidate" + else + NOTES="Release candidate" + fi + + RELEASE_ID=$(curl -sf -H "Authorization: token ${{ secrets.MOKOGITEA_TOKEN }}" \ + "${API_BASE}/releases/tags/release-candidate" | python3 -c "import json,sys; print(json.load(sys.stdin).get('id',''))" 2>/dev/null || true) + + if [ -n "$RELEASE_ID" ]; then + python3 -c " + import json, urllib.request + body = open('/dev/stdin').read() + payload = json.dumps({'body': body}).encode() + req = urllib.request.Request( + '${API_BASE}/releases/${RELEASE_ID}', + data=payload, method='PATCH', + headers={ + 'Authorization': 'token ${{ secrets.MOKOGITEA_TOKEN }}', + 'Content-Type': 'application/json' + }) + urllib.request.urlopen(req) + " <<< "$NOTES" + echo "RC release notes updated from CHANGELOG.md" + fi + + - name: Summary + if: always() + run: | + echo "## Promoted to Release Candidate" >> $GITHUB_STEP_SUMMARY + echo "Branch renamed to rc, minor bump, RC release built" >> $GITHUB_STEP_SUMMARY -- 2.52.0 From e6753a5320153b2c37ac8abcec2dff201668c835 Mon Sep 17 00:00:00 2001 From: Jonathan Miller <1+jmiller@noreply.git.mokoconsulting.tech> Date: Fri, 19 Jun 2026 07:11:56 +0000 Subject: [PATCH 06/13] chore: sync ci-generic.yml from Template-Joomla [skip ci] --- .mokogitea/workflows/ci-generic.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.mokogitea/workflows/ci-generic.yml b/.mokogitea/workflows/ci-generic.yml index 87fd059..92d2685 100644 --- a/.mokogitea/workflows/ci-generic.yml +++ b/.mokogitea/workflows/ci-generic.yml @@ -13,13 +13,6 @@ name: "Generic: Project CI" on: - push: - branches: - - main - - dev - - dev/** - - rc/** - - version/** pull_request: branches: - main -- 2.52.0 From e1a22662f961286aa89464674e0a25b4e95090bc Mon Sep 17 00:00:00 2001 From: Jonathan Miller <1+jmiller@noreply.git.mokoconsulting.tech> Date: Fri, 19 Jun 2026 07:11:57 +0000 Subject: [PATCH 07/13] chore: sync ci-joomla.yml from Template-Joomla [skip ci] --- .mokogitea/workflows/ci-joomla.yml | 403 +++++++++++++++++++++++++++++ 1 file changed, 403 insertions(+) diff --git a/.mokogitea/workflows/ci-joomla.yml b/.mokogitea/workflows/ci-joomla.yml index 0c6f5ea..1055efd 100644 --- a/.mokogitea/workflows/ci-joomla.yml +++ b/.mokogitea/workflows/ci-joomla.yml @@ -245,10 +245,413 @@ jobs: echo "All ${CHECKED} directories contain index.html." >> $GITHUB_STEP_SUMMARY fi + - name: Check config.xml and access.xml for components + run: | + echo "### Component Config & ACL Check" >> $GITHUB_STEP_SUMMARY + ERRORS=0 + + # Find all component manifests (XML with type="component") + COMP_MANIFESTS=$(find . -maxdepth 4 -name "*.xml" -not -path "./.git/*" -not -path "./vendor/*" -exec grep -l ']*type="component"' {} ; 2>/dev/null || true) + + if [ -z "$COMP_MANIFESTS" ]; then + echo "No component extensions found — skipping." >> $GITHUB_STEP_SUMMARY + else + for MANIFEST in $COMP_MANIFESTS; do + COMP_DIR=$(dirname "$MANIFEST") + COMP_NAME=$(basename "$COMP_DIR") + echo "Component: `${COMP_NAME}` (manifest: `${MANIFEST}`)" >> $GITHUB_STEP_SUMMARY + + # Check access.xml exists + ACCESS_FILE=$(find "$COMP_DIR" -name "access.xml" -not -path "./.git/*" 2>/dev/null | head -1) + if [ -z "$ACCESS_FILE" ]; then + echo "- Missing `access.xml` — ACL permissions will not work." >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + else + if command -v php &> /dev/null; then + if ! php -r "@simplexml_load_file('$ACCESS_FILE') ?: exit(1);" 2>/dev/null; then + echo "- `access.xml` is not well-formed XML." >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + else + for ACTION in core.admin core.manage; do + if ! grep -q "name=\"${ACTION}\"" "$ACCESS_FILE" 2>/dev/null; then + echo "- `access.xml` missing required action: `${ACTION}`" >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + fi + done + echo "- `access.xml`: valid" >> $GITHUB_STEP_SUMMARY + fi + fi + fi + + # Check config.xml exists + CONFIG_FILE=$(find "$COMP_DIR" -name "config.xml" -not -path "./.git/*" 2>/dev/null | head -1) + if [ -z "$CONFIG_FILE" ]; then + echo "- Missing `config.xml` — component Options page will be empty." >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + else + if command -v php &> /dev/null; then + if ! php -r "@simplexml_load_file('$CONFIG_FILE') ?: exit(1);" 2>/dev/null; then + echo "- `config.xml` is not well-formed XML." >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + else + echo "- `config.xml`: valid" >> $GITHUB_STEP_SUMMARY + fi + fi + fi + done + fi + + echo "" >> $GITHUB_STEP_SUMMARY + if [ "${ERRORS}" -gt 0 ]; then + echo "**${ERRORS} config/ACL issue(s) found.**" >> $GITHUB_STEP_SUMMARY + exit 1 + else + echo "**Component config & ACL check passed.**" >> $GITHUB_STEP_SUMMARY + fi + + - name: SQL schema validation + run: | + echo "### SQL Schema Validation" >> $GITHUB_STEP_SUMMARY + ERRORS=0 + + # Find SQL files in source/htdocs + SQL_FILES=$(find . -name "*.sql" -path "*/sql/*" -not -path "./.git/*" -not -path "./vendor/*" 2>/dev/null) + if [ -z "$SQL_FILES" ]; then + echo "No SQL files found — skipping." >> $GITHUB_STEP_SUMMARY + else + echo "Found $(echo "$SQL_FILES" | wc -l) SQL file(s)" >> $GITHUB_STEP_SUMMARY + + for FILE in $SQL_FILES; do + # Basic syntax check: balanced parentheses, no empty files + SIZE=$(wc -c < "$FILE" | tr -d ' ') + if [ "$SIZE" -eq 0 ]; then + echo "- Empty SQL file: \`${FILE}\`" >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + continue + fi + + # Check for common SQL errors + if grep -qP '^\s*$' "$FILE" && [ "$SIZE" -lt 5 ]; then + echo "- Whitespace-only SQL file: \`${FILE}\`" >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + continue + fi + + echo "- \`${FILE}\`: ${SIZE} bytes" >> $GITHUB_STEP_SUMMARY + done + + # Check update SQL files follow version numbering pattern + UPDATE_DIR=$(find . -path "*/sql/updates/mysql" -type d -not -path "./.git/*" 2>/dev/null | head -1) + if [ -n "$UPDATE_DIR" ]; then + BAD_NAMES=0 + for UFILE in "$UPDATE_DIR"/*.sql; do + [ ! -f "$UFILE" ] && continue + BASENAME=$(basename "$UFILE" .sql) + if ! echo "$BASENAME" | grep -qP '^\d+\.\d+\.\d+'; then + echo "- Update file \`${UFILE}\` does not follow version naming (expected X.Y.Z.sql)" >> $GITHUB_STEP_SUMMARY + BAD_NAMES=$((BAD_NAMES + 1)) + fi + done + if [ "$BAD_NAMES" -gt 0 ]; then + ERRORS=$((ERRORS + BAD_NAMES)) + fi + fi + fi + + echo "" >> $GITHUB_STEP_SUMMARY + if [ "${ERRORS}" -gt 0 ]; then + echo "**${ERRORS} SQL issue(s) found.**" >> $GITHUB_STEP_SUMMARY + exit 1 + else + echo "**SQL schema validation passed.**" >> $GITHUB_STEP_SUMMARY + fi + + - name: Manifest file references check + run: | + echo "### Manifest File References" >> $GITHUB_STEP_SUMMARY + ERRORS=0 + + MANIFEST="" + for XML_FILE in $(find . -maxdepth 2 -name "*.xml" -not -path "./.git/*" -not -path "./vendor/*"); do + if grep -q "/dev/null; then + MANIFEST="$XML_FILE" + break + fi + done + + if [ -z "$MANIFEST" ]; then + echo "No manifest found — skipping." >> $GITHUB_STEP_SUMMARY + else + MANIFEST_DIR=$(dirname "$MANIFEST") + + # Check references + FILENAMES=$(grep -oP ']*>\K[^<]+' "$MANIFEST" 2>/dev/null || true) + for F in $FILENAMES; do + if [ ! -f "${MANIFEST_DIR}/${F}" ] && [ ! -d "${MANIFEST_DIR}/${F}" ]; then + echo "- Missing: \`${F}\` (referenced in manifest)" >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + fi + done + + # Check references + FOLDERS=$(grep -oP ']*>\K[^<]+' "$MANIFEST" 2>/dev/null || true) + for F in $FOLDERS; do + if [ ! -d "${MANIFEST_DIR}/${F}" ]; then + echo "- Missing folder: \`${F}\` (referenced in manifest)" >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + fi + done + + # Check references in package manifests (ZIP files won't exist in source) + EXT_TYPE=$(grep -oP ']*\btype="\K[^"]+' "$MANIFEST" | head -1) + if [ "$EXT_TYPE" != "package" ]; then + FILES=$(grep -oP ']*>\K[^<]+' "$MANIFEST" 2>/dev/null || true) + for F in $FILES; do + if [ ! -f "${MANIFEST_DIR}/${F}" ]; then + echo "- Missing file: \`${F}\` (referenced in manifest)" >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + fi + done + fi + fi + + echo "" >> $GITHUB_STEP_SUMMARY + if [ "${ERRORS}" -gt 0 ]; then + echo "**${ERRORS} missing file reference(s).**" >> $GITHUB_STEP_SUMMARY + exit 1 + else + echo "**Manifest file references check passed.**" >> $GITHUB_STEP_SUMMARY + fi + + - name: Form XML validation + run: | + echo "### Form XML Validation" >> $GITHUB_STEP_SUMMARY + ERRORS=0 + + FORM_FILES=$(find . -name "*.xml" -path "*/forms/*" -not -path "./.git/*" -not -path "./vendor/*" 2>/dev/null) + if [ -z "$FORM_FILES" ]; then + echo "No form XML files found — skipping." >> $GITHUB_STEP_SUMMARY + else + echo "Found $(echo "$FORM_FILES" | wc -l) form file(s)" >> $GITHUB_STEP_SUMMARY + for FILE in $FORM_FILES; do + if command -v php &> /dev/null; then + if ! php -r "@simplexml_load_file('$FILE') ?: exit(1);" 2>/dev/null; then + echo "- \`${FILE}\`: malformed XML" >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + else + # Check for valid Joomla form structure + if ! grep -qE '/dev/null; then + echo "- \`${FILE}\`: no \`
\`, \`\`, or \`
\` elements found" >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + else + echo "- \`${FILE}\`: valid" >> $GITHUB_STEP_SUMMARY + fi + fi + fi + done + fi + + echo "" >> $GITHUB_STEP_SUMMARY + if [ "${ERRORS}" -gt 0 ]; then + echo "**${ERRORS} form XML issue(s).**" >> $GITHUB_STEP_SUMMARY + exit 1 + else + echo "**Form XML validation passed.**" >> $GITHUB_STEP_SUMMARY + fi + + - name: Deprecated Joomla API check + continue-on-error: true + run: | + echo "### Deprecated Joomla API Check" >> $GITHUB_STEP_SUMMARY + WARNINGS=0 + + SRC_DIR="" + for DIR in source/ src/ htdocs/; do + [ -d "$DIR" ] && SRC_DIR="$DIR" && break + done + + if [ -z "$SRC_DIR" ]; then + echo "No source directory found — skipping." >> $GITHUB_STEP_SUMMARY + else + # Joomla 3/4 deprecated patterns that break in Joomla 6 + PATTERNS=( + 'JFactory::' + 'JText::' + 'JHtml::' + 'JRoute::' + 'JUri::' + 'JLog::' + 'JTable::' + 'JInput' + 'CMSFactory::\$application' + 'JApplicationCms' + ) + + for PATTERN in "${PATTERNS[@]}"; do + HITS=$(grep -rnl "$PATTERN" "$SRC_DIR" --include="*.php" 2>/dev/null || true) + if [ -n "$HITS" ]; then + COUNT=$(echo "$HITS" | wc -l) + echo "- \`${PATTERN}\` found in ${COUNT} file(s)" >> $GITHUB_STEP_SUMMARY + WARNINGS=$((WARNINGS + COUNT)) + fi + done + + echo "" >> $GITHUB_STEP_SUMMARY + if [ "$WARNINGS" -gt 0 ]; then + echo "**${WARNINGS} deprecated API usage(s) found.** These will break in Joomla 6." >> $GITHUB_STEP_SUMMARY + else + echo "**No deprecated APIs found.**" >> $GITHUB_STEP_SUMMARY + fi + fi + + - name: Template output escaping check + continue-on-error: true + run: | + echo "### Template Output Escaping" >> $GITHUB_STEP_SUMMARY + WARNINGS=0 + + TMPL_FILES=$(find . -name "*.php" -path "*/tmpl/*" -not -path "./.git/*" -not -path "./vendor/*" 2>/dev/null) + if [ -z "$TMPL_FILES" ]; then + echo "No template files found — skipping." >> $GITHUB_STEP_SUMMARY + else + echo "Found $(echo "$TMPL_FILES" | wc -l) template file(s)" >> $GITHUB_STEP_SUMMARY + + for FILE in $TMPL_FILES; do + # Check for unescaped output: or echo $var without escape() + UNESCAPED=$(grep -nP '<\?=\s*\$(?!this->escape)' "$FILE" 2>/dev/null || true) + if [ -n "$UNESCAPED" ]; then + HITS=$(echo "$UNESCAPED" | wc -l) + echo "- \`${FILE}\`: ${HITS} unescaped \`\` output(s) — use \`escape(\$var) ?>\`" >> $GITHUB_STEP_SUMMARY + WARNINGS=$((WARNINGS + HITS)) + fi + + # Check for echo without escaping in template context + RAW_ECHO=$(grep -nP '^\s*echo\s+\$(?!this->escape)' "$FILE" 2>/dev/null || true) + if [ -n "$RAW_ECHO" ]; then + HITS=$(echo "$RAW_ECHO" | wc -l) + echo "- \`${FILE}\`: ${HITS} raw \`echo \$var\` — consider \`echo \$this->escape(\$var)\`" >> $GITHUB_STEP_SUMMARY + WARNINGS=$((WARNINGS + HITS)) + fi + done + + echo "" >> $GITHUB_STEP_SUMMARY + if [ "$WARNINGS" -gt 0 ]; then + echo "**${WARNINGS} potential XSS risk(s) in templates.** Review unescaped output." >> $GITHUB_STEP_SUMMARY + else + echo "**All template output appears properly escaped.**" >> $GITHUB_STEP_SUMMARY + fi + fi + + - name: Namespace consistency check + run: | + echo "### Namespace Consistency" >> $GITHUB_STEP_SUMMARY + ERRORS=0 + + # Find component/plugin manifests with tags + MANIFESTS=$(find . -maxdepth 4 -name "*.xml" -not -path "./.git/*" -not -path "./vendor/*" -exec grep -l '/dev/null || true) + + if [ -z "$MANIFESTS" ]; then + echo "No manifests with \`\` found — skipping." >> $GITHUB_STEP_SUMMARY + else + for MANIFEST in $MANIFESTS; do + NS_PATH=$(grep -oP ']*>\K[^<]+' "$MANIFEST" 2>/dev/null | head -1) + [ -z "$NS_PATH" ] && continue + MANIFEST_DIR=$(dirname "$MANIFEST") + + echo "Manifest: \`${MANIFEST}\` → namespace \`${NS_PATH}\`" >> $GITHUB_STEP_SUMMARY + + # Check PHP files have matching namespace + while IFS= read -r -d '' PHP_FILE; do + FILE_NS=$(grep -oP '^\s*namespace\s+\K[^;]+' "$PHP_FILE" 2>/dev/null | head -1) + [ -z "$FILE_NS" ] && continue + + # Namespace should start with the manifest namespace path + if ! echo "$FILE_NS" | grep -qF "${NS_PATH}"; then + echo "- \`${PHP_FILE}\`: namespace \`${FILE_NS}\` doesn't match manifest \`${NS_PATH}\`" >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + fi + done < <(find "$MANIFEST_DIR" -name "*.php" -path "*/src/*" -not -path "./vendor/*" -print0 2>/dev/null) + done + fi + + echo "" >> $GITHUB_STEP_SUMMARY + if [ "${ERRORS}" -gt 0 ]; then + echo "**${ERRORS} namespace mismatch(es).**" >> $GITHUB_STEP_SUMMARY + exit 1 + else + echo "**Namespace consistency check passed.**" >> $GITHUB_STEP_SUMMARY + fi + + - name: SPDX license header check + continue-on-error: true + run: | + echo "### SPDX License Headers" >> $GITHUB_STEP_SUMMARY + MISSING=0 + + SRC_DIR="" + for DIR in source/ src/ htdocs/; do + [ -d "$DIR" ] && SRC_DIR="$DIR" && break + done + + if [ -z "$SRC_DIR" ]; then + echo "No source directory found — skipping." >> $GITHUB_STEP_SUMMARY + else + TOTAL=0 + while IFS= read -r -d '' FILE; do + TOTAL=$((TOTAL + 1)) + if ! head -10 "$FILE" | grep -qi "SPDX"; then + echo "- Missing SPDX header: \`${FILE}\`" >> $GITHUB_STEP_SUMMARY + MISSING=$((MISSING + 1)) + fi + done < <(find "$SRC_DIR" -name "*.php" -not -path "./vendor/*" -print0) + + echo "" >> $GITHUB_STEP_SUMMARY + if [ "$MISSING" -gt 0 ]; then + echo "**${MISSING}/${TOTAL} PHP file(s) missing SPDX license header.**" >> $GITHUB_STEP_SUMMARY + else + echo "**All ${TOTAL} PHP files have SPDX headers.**" >> $GITHUB_STEP_SUMMARY + fi + fi + + - name: Service provider check + run: | + echo "### Service Provider Check" >> $GITHUB_STEP_SUMMARY + ERRORS=0 + + PROVIDERS=$(find . -name "provider.php" -path "*/services/*" -not -path "./.git/*" -not -path "./vendor/*" 2>/dev/null) + if [ -z "$PROVIDERS" ]; then + echo "No service providers found — skipping." >> $GITHUB_STEP_SUMMARY + else + for FILE in $PROVIDERS; do + # Must return a ServiceProviderInterface + if ! grep -qP 'ServiceProviderInterface|ComponentInterface|MVCFactoryInterface|DispatcherInterface' "$FILE" 2>/dev/null; then + echo "- \`${FILE}\`: does not reference ServiceProviderInterface or component interfaces" >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + else + echo "- \`${FILE}\`: valid service provider" >> $GITHUB_STEP_SUMMARY + fi + + # Must have return statement + if ! grep -qP '^\s*return\s+new\s+' "$FILE" 2>/dev/null; then + echo "- \`${FILE}\`: missing \`return new ...\` statement" >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS + 1)) + fi + done + fi + + echo "" >> $GITHUB_STEP_SUMMARY + if [ "${ERRORS}" -gt 0 ]; then + echo "**${ERRORS} service provider issue(s).**" >> $GITHUB_STEP_SUMMARY + exit 1 + else + echo "**Service provider check passed.**" >> $GITHUB_STEP_SUMMARY + fi + release-readiness: name: Release Readiness Check runs-on: ubuntu-latest if: github.event_name == 'pull_request' && github.base_ref == 'main' + continue-on-error: true steps: - name: Checkout repository -- 2.52.0 From cc026ab44a3643d53a3c48d2f49f4fb813364909 Mon Sep 17 00:00:00 2001 From: Jonathan Miller <1+jmiller@noreply.git.mokoconsulting.tech> Date: Fri, 19 Jun 2026 07:11:58 +0000 Subject: [PATCH 08/13] chore: sync issue-branch.yml from Template-Joomla [skip ci] --- .mokogitea/workflows/issue-branch.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.mokogitea/workflows/issue-branch.yml b/.mokogitea/workflows/issue-branch.yml index 21bfe40..c2b02a6 100644 --- a/.mokogitea/workflows/issue-branch.yml +++ b/.mokogitea/workflows/issue-branch.yml @@ -5,7 +5,7 @@ # FILE INFORMATION # DEFGROUP: Gitea.Workflow # INGROUP: moko-platform.Automation -# VERSION: 02.22.00 +# VERSION: 01.00.00 # BRIEF: Auto-create feature branch when an issue is opened name: "Universal: Issue Branch" @@ -28,7 +28,7 @@ jobs: steps: - name: Create branch and comment run: | - TOKEN="${{ secrets.MOKOGITEA_TOKEN }}" + TOKEN="${{ secrets.GA_TOKEN }}" API="${GITEA_URL}/api/v1/repos/${{ github.repository }}" ISSUE_NUM="${{ github.event.issue.number }}" ISSUE_TITLE="${{ github.event.issue.title }}" -- 2.52.0 From 7f7f16cc37918f7284c3457dc51f982bf62a195f Mon Sep 17 00:00:00 2001 From: Jonathan Miller <1+jmiller@noreply.git.mokoconsulting.tech> Date: Fri, 19 Jun 2026 07:11:59 +0000 Subject: [PATCH 09/13] chore: sync rc-revert.yml from Template-Joomla [skip ci] --- .mokogitea/workflows/rc-revert.yml | 66 ++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .mokogitea/workflows/rc-revert.yml diff --git a/.mokogitea/workflows/rc-revert.yml b/.mokogitea/workflows/rc-revert.yml new file mode 100644 index 0000000..f54b184 --- /dev/null +++ b/.mokogitea/workflows/rc-revert.yml @@ -0,0 +1,66 @@ +# Copyright (C) 2026 Moko Consulting +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +# FILE INFORMATION +# DEFGROUP: Gitea.Workflow +# INGROUP: MokoPlatform.Universal +# REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform +# PATH: /.mokogitea/workflows/rc-revert.yml +# VERSION: 09.23.00 +# BRIEF: Rename rc/ branch back to dev/ when PR is closed without merge + +name: "RC Revert" + +on: + pull_request: + types: [closed] + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + +jobs: + revert: + name: Rename rc/ back to dev/ + runs-on: ubuntu-latest + if: >- + github.event.pull_request.merged == false && + startsWith(github.event.pull_request.head.ref, 'rc/') + + steps: + - name: Rename branch + run: | + BRANCH="${{ github.event.pull_request.head.ref }}" + SUFFIX="${BRANCH#rc/}" + DEV_BRANCH="dev/${SUFFIX}" + API="${{ vars.GITEA_URL || 'https://git.mokoconsulting.tech' }}/api/v1/repos/${{ github.repository }}/branches" + TOKEN="${{ secrets.MOKOGITEA_TOKEN }}" + + # Create dev/ branch from rc/ branch + STATUS=$(curl -sf -o /dev/null -w "%{http_code}" -X POST \ + -H "Authorization: token ${TOKEN}" \ + -H "Content-Type: application/json" \ + -d "{\"new_branch_name\": \"${DEV_BRANCH}\", \"old_branch_name\": \"${BRANCH}\"}" \ + "${API}" 2>/dev/null || true) + + if [ "$STATUS" = "201" ]; then + echo "Created branch: ${DEV_BRANCH}" >> $GITHUB_STEP_SUMMARY + else + echo "::error::Failed to create ${DEV_BRANCH} from ${BRANCH} (HTTP ${STATUS})" + exit 1 + fi + + # Delete rc/ branch + ENCODED=$(php -r "echo rawurlencode('${BRANCH}');") + STATUS=$(curl -sf -o /dev/null -w "%{http_code}" -X DELETE \ + -H "Authorization: token ${TOKEN}" \ + "${API}/${ENCODED}" 2>/dev/null || true) + + if [ "$STATUS" = "204" ]; then + echo "Deleted branch: ${BRANCH}" >> $GITHUB_STEP_SUMMARY + else + echo "::warning::Failed to delete ${BRANCH} (HTTP ${STATUS})" + fi + + echo "### RC Reverted" >> $GITHUB_STEP_SUMMARY + echo "${BRANCH} → ${DEV_BRANCH}" >> $GITHUB_STEP_SUMMARY -- 2.52.0 From cf4483b24f8a823e291314a15cfacfb5224130a7 Mon Sep 17 00:00:00 2001 From: Jonathan Miller <1+jmiller@noreply.git.mokoconsulting.tech> Date: Fri, 19 Jun 2026 07:12:00 +0000 Subject: [PATCH 10/13] chore: sync repo-health.yml from Template-Joomla [skip ci] --- .mokogitea/workflows/repo-health.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.mokogitea/workflows/repo-health.yml b/.mokogitea/workflows/repo-health.yml index 8d57aaf..e466ae3 100644 --- a/.mokogitea/workflows/repo-health.yml +++ b/.mokogitea/workflows/repo-health.yml @@ -33,7 +33,8 @@ on: - scripts - repo pull_request: - push: + branches: + - main permissions: contents: read -- 2.52.0 From 56a70cd41df1f5e723bb2758a94e06f097c8aef5 Mon Sep 17 00:00:00 2001 From: Jonathan Miller <1+jmiller@noreply.git.mokoconsulting.tech> Date: Fri, 19 Jun 2026 07:12:01 +0000 Subject: [PATCH 11/13] chore: sync workflow-sync-trigger.yml from Template-Joomla [skip ci] --- .../workflows/workflow-sync-trigger.yml | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 .mokogitea/workflows/workflow-sync-trigger.yml diff --git a/.mokogitea/workflows/workflow-sync-trigger.yml b/.mokogitea/workflows/workflow-sync-trigger.yml new file mode 100644 index 0000000..7cb2d22 --- /dev/null +++ b/.mokogitea/workflows/workflow-sync-trigger.yml @@ -0,0 +1,73 @@ +# Copyright (C) 2026 Moko Consulting +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +# FILE INFORMATION +# DEFGROUP: Gitea.Workflow +# INGROUP: MokoPlatform.Universal +# REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform +# PATH: /.mokogitea/workflows/workflow-sync-trigger.yml +# VERSION: 01.01.00 +# BRIEF: Trigger workflow sync to live repos when a PR is merged to main + +name: "Universal: Workflow Sync Trigger" + +on: + pull_request: + types: [closed] + branches: + - main + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + +jobs: + sync: + name: Sync workflows to live repos + runs-on: ubuntu-latest + if: >- + github.event.pull_request.merged == true && + !contains(github.event.pull_request.title, '[skip sync]') + + steps: + - name: Determine platform from repo name + id: platform + run: | + REPO="${{ github.event.repository.name }}" + case "$REPO" in + Template-Joomla) PLATFORM="joomla" ;; + Template-Dolibarr) PLATFORM="dolibarr" ;; + Template-Go) PLATFORM="go" ;; + Template-MCP) PLATFORM="mcp" ;; + Template-Generic) PLATFORM="" ;; + *) PLATFORM="" ;; + esac + echo "platform=$PLATFORM" >> "$GITHUB_OUTPUT" + echo "Platform: ${PLATFORM:-all}" + + - name: Clone mokoplatform + env: + MOKOGITEA_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }} + run: | + GITEA_URL="${{ vars.GITEA_URL || 'https://git.mokoconsulting.tech' }}" + git clone --depth 1 "${GITEA_URL}/MokoConsulting/mokoplatform.git" /tmp/mokoplatform + + - name: Install dependencies + run: | + cd /tmp/mokoplatform + composer install --no-dev --no-interaction --quiet 2>/dev/null || true + + - name: Run workflow sync + env: + MOKOGITEA_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }} + run: | + ARGS="--token ${MOKOGITEA_TOKEN}" + ARGS="${ARGS} --org ${{ vars.GITEA_ORG || github.repository_owner }}" + ARGS="${ARGS} --phase repos" + + PLATFORM="${{ steps.platform.outputs.platform }}" + if [ -n "$PLATFORM" ]; then + ARGS="${ARGS} --platform-filter ${PLATFORM}" + fi + + php /tmp/mokoplatform/cli/workflow_sync.php ${ARGS} -- 2.52.0 From 0fe28e83ee4470f7c8f62119c588638b75dc867e Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Fri, 19 Jun 2026 04:05:51 -0500 Subject: [PATCH 12/13] refactor: rename src/ to source/ --- {src => source}/.build-trigger | 0 {src => source}/component.php | 0 {src => source}/custom.php | 0 {src => source}/error.php | 0 {src => source}/helper/favicon.php | 0 {src => source}/helper/index.html | 0 {src => source}/helper/migrate.php | 0 {src => source}/helper/minify.php | 0 {src => source}/html/com_content/article/index.html | 0 .../html/com_content/article/toc-left.php | 0 .../html/com_content/article/toc-right.php | 0 {src => source}/html/layouts/joomla/module/card.php | 0 .../html/layouts/joomla/module/index.html | 0 .../html/layouts/mokoonyx/article-metadata.php | 0 {src => source}/html/layouts/mokoonyx/index.html | 0 .../html/layouts/mokoonyx/social-icons.php | 0 .../html/mod_articles_archive/default.php | 0 .../html/mod_articles_archive/index.html | 0 .../html/mod_articles_categories/default.php | 0 .../html/mod_articles_categories/index.html | 0 .../html/mod_articles_category/default.php | 0 .../html/mod_articles_category/index.html | 0 .../html/mod_articles_latest/default.php | 0 {src => source}/html/mod_articles_latest/index.html | 0 {src => source}/html/mod_articles_news/default.php | 0 {src => source}/html/mod_articles_news/index.html | 0 .../html/mod_articles_popular/default.php | 0 .../html/mod_articles_popular/index.html | 0 {src => source}/html/mod_banners/default.php | 0 {src => source}/html/mod_banners/index.html | 0 {src => source}/html/mod_breadcrumbs/default.php | 0 {src => source}/html/mod_breadcrumbs/index.html | 0 {src => source}/html/mod_cblogin/default.php | 0 {src => source}/html/mod_cblogin/default_logout.php | 0 {src => source}/html/mod_cblogin/index.html | 0 .../html/mod_comprofilermoderator/default.php | 0 .../html/mod_comprofilermoderator/index.html | 0 .../html/mod_comprofileronline/default.php | 0 .../html/mod_comprofileronline/index.html | 0 {src => source}/html/mod_custom/default.php | 0 {src => source}/html/mod_custom/hero.php | 0 .../html/mod_dpcalendar_counter/default.php | 0 .../html/mod_dpcalendar_counter/index.html | 0 {src => source}/html/mod_dpcalendar_map/default.php | 0 {src => source}/html/mod_dpcalendar_map/index.html | 0 .../html/mod_dpcalendar_mini/_scripts.php | 0 .../html/mod_dpcalendar_mini/default.php | 0 .../html/mod_dpcalendar_mini/default_icons.php | 0 .../html/mod_dpcalendar_mini/default_map.php | 0 .../html/mod_dpcalendar_mini/default_quickadd.php | 0 {src => source}/html/mod_dpcalendar_mini/index.html | 0 .../html/mod_dpcalendar_upcoming/_scripts.php | 0 .../html/mod_dpcalendar_upcoming/default.php | 0 .../html/mod_dpcalendar_upcoming/index.html | 0 {src => source}/html/mod_feed/default.php | 0 {src => source}/html/mod_feed/index.html | 0 {src => source}/html/mod_finder/default.php | 0 {src => source}/html/mod_finder/index.html | 0 {src => source}/html/mod_footer/default.php | 0 {src => source}/html/mod_footer/index.html | 0 {src => source}/html/mod_languages/default.php | 0 {src => source}/html/mod_languages/index.html | 0 {src => source}/html/mod_login/default.php | 0 {src => source}/html/mod_login/index.html | 0 {src => source}/html/mod_menu/default.php | 0 {src => source}/html/mod_menu/default_component.php | 0 {src => source}/html/mod_menu/default_heading.php | 0 {src => source}/html/mod_menu/default_separator.php | 0 {src => source}/html/mod_menu/default_url.php | 0 {src => source}/html/mod_menu/horizontal.php | 0 .../html/mod_menu/horizontal_component.php | 0 .../html/mod_menu/horizontal_heading.php | 0 .../html/mod_menu/horizontal_separator.php | 0 {src => source}/html/mod_menu/horizontal_url.php | 0 {src => source}/html/mod_menu/index.html | 0 {src => source}/html/mod_menu/mainmenu.php | 0 .../html/mod_menu/mainmenu_component.php | 0 {src => source}/html/mod_menu/mainmenu_heading.php | 0 .../html/mod_menu/mainmenu_separator.php | 0 {src => source}/html/mod_menu/mainmenu_url.php | 0 {src => source}/html/mod_random_image/default.php | 0 {src => source}/html/mod_random_image/index.html | 0 {src => source}/html/mod_related_items/default.php | 0 {src => source}/html/mod_related_items/index.html | 0 {src => source}/html/mod_stats/default.php | 0 {src => source}/html/mod_stats/index.html | 0 {src => source}/html/mod_syndicate/default.php | 0 {src => source}/html/mod_syndicate/index.html | 0 {src => source}/html/mod_tags_popular/default.php | 0 {src => source}/html/mod_tags_popular/index.html | 0 {src => source}/html/mod_tags_similar/default.php | 0 {src => source}/html/mod_tags_similar/index.html | 0 {src => source}/html/mod_users_latest/default.php | 0 {src => source}/html/mod_users_latest/index.html | 0 {src => source}/html/mod_whosonline/default.php | 0 {src => source}/html/mod_whosonline/index.html | 0 {src => source}/html/mod_wrapper/default.php | 0 {src => source}/html/mod_wrapper/index.html | 0 {src => source}/index.html | 0 {src => source}/index.php | 0 {src => source}/joomla.asset.json | 0 {src => source}/language/en-GB/index.html | 0 {src => source}/language/en-GB/tpl_mokoonyx.ini | 0 {src => source}/language/en-GB/tpl_mokoonyx.sys.ini | 0 {src => source}/language/en-US/index.html | 0 {src => source}/language/en-US/tpl_mokoonyx.ini | 0 {src => source}/language/en-US/tpl_mokoonyx.sys.ini | 0 {src => source}/language/index.html | 0 {src => source}/media/css/a11y-high-contrast.css | 0 {src => source}/media/css/component.css | 0 {src => source}/media/css/editor.css | 0 {src => source}/media/css/fonts/osaka.css | 0 {src => source}/media/css/fonts/roboto.css | 0 {src => source}/media/css/index.html | 0 {src => source}/media/css/offline.css | 0 {src => source}/media/css/system/index.html | 0 .../media/css/system/searchtools/index.html | 0 .../media/css/system/searchtools/searchtools.css | 0 {src => source}/media/css/template-rtl.css | 0 {src => source}/media/css/template.css | 0 {src => source}/media/css/theme/dark.standard.css | 0 {src => source}/media/css/theme/index.html | 0 {src => source}/media/css/theme/light.standard.css | 0 {src => source}/media/fonts/index.html | 0 {src => source}/media/fonts/osaka-re.woff | Bin .../media/fonts/roboto-v51-latin-100.woff2 | Bin .../media/fonts/roboto-v51-latin-100italic.woff2 | Bin .../media/fonts/roboto-v51-latin-200.woff2 | Bin .../media/fonts/roboto-v51-latin-200italic.woff2 | Bin .../media/fonts/roboto-v51-latin-300.woff2 | Bin .../media/fonts/roboto-v51-latin-300italic.woff2 | Bin .../media/fonts/roboto-v51-latin-500.woff2 | Bin .../media/fonts/roboto-v51-latin-500italic.woff2 | Bin .../media/fonts/roboto-v51-latin-600.woff2 | Bin .../media/fonts/roboto-v51-latin-600italic.woff2 | Bin .../media/fonts/roboto-v51-latin-700.woff2 | Bin .../media/fonts/roboto-v51-latin-700italic.woff2 | Bin .../media/fonts/roboto-v51-latin-800.woff2 | Bin .../media/fonts/roboto-v51-latin-800italic.woff2 | Bin .../media/fonts/roboto-v51-latin-900.woff2 | Bin .../media/fonts/roboto-v51-latin-900italic.woff2 | Bin .../media/fonts/roboto-v51-latin-italic.woff2 | Bin .../media/fonts/roboto-v51-latin-regular.woff2 | Bin {src => source}/media/images/bg.svg | 0 {src => source}/media/images/hero.jpg | Bin {src => source}/media/images/index.html | 0 .../media/images/select-bg-active-rtl.svg | 0 {src => source}/media/images/select-bg-active.svg | 0 {src => source}/media/images/select-bg-rtl.svg | 0 {src => source}/media/images/select-bg.svg | 0 {src => source}/media/images/template_thumbnail.png | Bin {src => source}/media/index.html | 0 {src => source}/media/js/gtm.js | 0 {src => source}/media/js/index.html | 0 {src => source}/media/js/mod_menu/index.html | 0 .../media/js/mod_menu/menu-metismenu-es5.js | 0 {src => source}/media/js/mod_menu/menu-metismenu.js | 0 {src => source}/media/js/template.js | 0 .../media/vendor/bootstrap-toc/bootstrap-toc.css | 0 .../media/vendor/bootstrap-toc/bootstrap-toc.js | 0 .../media/vendor/bootstrap-toc/index.html | 0 .../media/vendor/fa7free/css/all.min.css | 0 .../media/vendor/fa7free/css/brands.min.css | 0 .../media/vendor/fa7free/css/fontawesome.min.css | 0 .../media/vendor/fa7free/css/regular.min.css | 0 .../media/vendor/fa7free/css/solid.min.css | 0 .../vendor/fa7free/webfonts/fa-brands-400.woff2 | Bin .../vendor/fa7free/webfonts/fa-regular-400.woff2 | Bin .../vendor/fa7free/webfonts/fa-solid-900.woff2 | Bin .../fa7free/webfonts/fa-v4compatibility.woff2 | Bin {src => source}/media/vendor/index.html | 0 {src => source}/offline.php | 0 {src => source}/script.php | 0 {src => source}/sync_custom_vars.php | 0 {src => source}/templateDetails.xml | 0 {src => source}/templates/brand-showcase.html | 0 {src => source}/templates/dark.custom.css | 0 {src => source}/templates/light.custom.css | 0 178 files changed, 0 insertions(+), 0 deletions(-) rename {src => source}/.build-trigger (100%) rename {src => source}/component.php (100%) rename {src => source}/custom.php (100%) rename {src => source}/error.php (100%) rename {src => source}/helper/favicon.php (100%) rename {src => source}/helper/index.html (100%) rename {src => source}/helper/migrate.php (100%) rename {src => source}/helper/minify.php (100%) rename {src => source}/html/com_content/article/index.html (100%) rename {src => source}/html/com_content/article/toc-left.php (100%) rename {src => source}/html/com_content/article/toc-right.php (100%) rename {src => source}/html/layouts/joomla/module/card.php (100%) rename {src => source}/html/layouts/joomla/module/index.html (100%) rename {src => source}/html/layouts/mokoonyx/article-metadata.php (100%) rename {src => source}/html/layouts/mokoonyx/index.html (100%) rename {src => source}/html/layouts/mokoonyx/social-icons.php (100%) rename {src => source}/html/mod_articles_archive/default.php (100%) rename {src => source}/html/mod_articles_archive/index.html (100%) rename {src => source}/html/mod_articles_categories/default.php (100%) rename {src => source}/html/mod_articles_categories/index.html (100%) rename {src => source}/html/mod_articles_category/default.php (100%) rename {src => source}/html/mod_articles_category/index.html (100%) rename {src => source}/html/mod_articles_latest/default.php (100%) rename {src => source}/html/mod_articles_latest/index.html (100%) rename {src => source}/html/mod_articles_news/default.php (100%) rename {src => source}/html/mod_articles_news/index.html (100%) rename {src => source}/html/mod_articles_popular/default.php (100%) rename {src => source}/html/mod_articles_popular/index.html (100%) rename {src => source}/html/mod_banners/default.php (100%) rename {src => source}/html/mod_banners/index.html (100%) rename {src => source}/html/mod_breadcrumbs/default.php (100%) rename {src => source}/html/mod_breadcrumbs/index.html (100%) rename {src => source}/html/mod_cblogin/default.php (100%) rename {src => source}/html/mod_cblogin/default_logout.php (100%) rename {src => source}/html/mod_cblogin/index.html (100%) rename {src => source}/html/mod_comprofilermoderator/default.php (100%) rename {src => source}/html/mod_comprofilermoderator/index.html (100%) rename {src => source}/html/mod_comprofileronline/default.php (100%) rename {src => source}/html/mod_comprofileronline/index.html (100%) rename {src => source}/html/mod_custom/default.php (100%) rename {src => source}/html/mod_custom/hero.php (100%) rename {src => source}/html/mod_dpcalendar_counter/default.php (100%) rename {src => source}/html/mod_dpcalendar_counter/index.html (100%) rename {src => source}/html/mod_dpcalendar_map/default.php (100%) rename {src => source}/html/mod_dpcalendar_map/index.html (100%) rename {src => source}/html/mod_dpcalendar_mini/_scripts.php (100%) rename {src => source}/html/mod_dpcalendar_mini/default.php (100%) rename {src => source}/html/mod_dpcalendar_mini/default_icons.php (100%) rename {src => source}/html/mod_dpcalendar_mini/default_map.php (100%) rename {src => source}/html/mod_dpcalendar_mini/default_quickadd.php (100%) rename {src => source}/html/mod_dpcalendar_mini/index.html (100%) rename {src => source}/html/mod_dpcalendar_upcoming/_scripts.php (100%) rename {src => source}/html/mod_dpcalendar_upcoming/default.php (100%) rename {src => source}/html/mod_dpcalendar_upcoming/index.html (100%) rename {src => source}/html/mod_feed/default.php (100%) rename {src => source}/html/mod_feed/index.html (100%) rename {src => source}/html/mod_finder/default.php (100%) rename {src => source}/html/mod_finder/index.html (100%) rename {src => source}/html/mod_footer/default.php (100%) rename {src => source}/html/mod_footer/index.html (100%) rename {src => source}/html/mod_languages/default.php (100%) rename {src => source}/html/mod_languages/index.html (100%) rename {src => source}/html/mod_login/default.php (100%) rename {src => source}/html/mod_login/index.html (100%) rename {src => source}/html/mod_menu/default.php (100%) rename {src => source}/html/mod_menu/default_component.php (100%) rename {src => source}/html/mod_menu/default_heading.php (100%) rename {src => source}/html/mod_menu/default_separator.php (100%) rename {src => source}/html/mod_menu/default_url.php (100%) rename {src => source}/html/mod_menu/horizontal.php (100%) rename {src => source}/html/mod_menu/horizontal_component.php (100%) rename {src => source}/html/mod_menu/horizontal_heading.php (100%) rename {src => source}/html/mod_menu/horizontal_separator.php (100%) rename {src => source}/html/mod_menu/horizontal_url.php (100%) rename {src => source}/html/mod_menu/index.html (100%) rename {src => source}/html/mod_menu/mainmenu.php (100%) rename {src => source}/html/mod_menu/mainmenu_component.php (100%) rename {src => source}/html/mod_menu/mainmenu_heading.php (100%) rename {src => source}/html/mod_menu/mainmenu_separator.php (100%) rename {src => source}/html/mod_menu/mainmenu_url.php (100%) rename {src => source}/html/mod_random_image/default.php (100%) rename {src => source}/html/mod_random_image/index.html (100%) rename {src => source}/html/mod_related_items/default.php (100%) rename {src => source}/html/mod_related_items/index.html (100%) rename {src => source}/html/mod_stats/default.php (100%) rename {src => source}/html/mod_stats/index.html (100%) rename {src => source}/html/mod_syndicate/default.php (100%) rename {src => source}/html/mod_syndicate/index.html (100%) rename {src => source}/html/mod_tags_popular/default.php (100%) rename {src => source}/html/mod_tags_popular/index.html (100%) rename {src => source}/html/mod_tags_similar/default.php (100%) rename {src => source}/html/mod_tags_similar/index.html (100%) rename {src => source}/html/mod_users_latest/default.php (100%) rename {src => source}/html/mod_users_latest/index.html (100%) rename {src => source}/html/mod_whosonline/default.php (100%) rename {src => source}/html/mod_whosonline/index.html (100%) rename {src => source}/html/mod_wrapper/default.php (100%) rename {src => source}/html/mod_wrapper/index.html (100%) rename {src => source}/index.html (100%) rename {src => source}/index.php (100%) rename {src => source}/joomla.asset.json (100%) rename {src => source}/language/en-GB/index.html (100%) rename {src => source}/language/en-GB/tpl_mokoonyx.ini (100%) rename {src => source}/language/en-GB/tpl_mokoonyx.sys.ini (100%) rename {src => source}/language/en-US/index.html (100%) rename {src => source}/language/en-US/tpl_mokoonyx.ini (100%) rename {src => source}/language/en-US/tpl_mokoonyx.sys.ini (100%) rename {src => source}/language/index.html (100%) rename {src => source}/media/css/a11y-high-contrast.css (100%) rename {src => source}/media/css/component.css (100%) rename {src => source}/media/css/editor.css (100%) rename {src => source}/media/css/fonts/osaka.css (100%) rename {src => source}/media/css/fonts/roboto.css (100%) rename {src => source}/media/css/index.html (100%) rename {src => source}/media/css/offline.css (100%) rename {src => source}/media/css/system/index.html (100%) rename {src => source}/media/css/system/searchtools/index.html (100%) rename {src => source}/media/css/system/searchtools/searchtools.css (100%) rename {src => source}/media/css/template-rtl.css (100%) rename {src => source}/media/css/template.css (100%) rename {src => source}/media/css/theme/dark.standard.css (100%) rename {src => source}/media/css/theme/index.html (100%) rename {src => source}/media/css/theme/light.standard.css (100%) rename {src => source}/media/fonts/index.html (100%) rename {src => source}/media/fonts/osaka-re.woff (100%) rename {src => source}/media/fonts/roboto-v51-latin-100.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-100italic.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-200.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-200italic.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-300.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-300italic.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-500.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-500italic.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-600.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-600italic.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-700.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-700italic.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-800.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-800italic.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-900.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-900italic.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-italic.woff2 (100%) rename {src => source}/media/fonts/roboto-v51-latin-regular.woff2 (100%) rename {src => source}/media/images/bg.svg (100%) rename {src => source}/media/images/hero.jpg (100%) rename {src => source}/media/images/index.html (100%) rename {src => source}/media/images/select-bg-active-rtl.svg (100%) rename {src => source}/media/images/select-bg-active.svg (100%) rename {src => source}/media/images/select-bg-rtl.svg (100%) rename {src => source}/media/images/select-bg.svg (100%) rename {src => source}/media/images/template_thumbnail.png (100%) rename {src => source}/media/index.html (100%) rename {src => source}/media/js/gtm.js (100%) rename {src => source}/media/js/index.html (100%) rename {src => source}/media/js/mod_menu/index.html (100%) rename {src => source}/media/js/mod_menu/menu-metismenu-es5.js (100%) rename {src => source}/media/js/mod_menu/menu-metismenu.js (100%) rename {src => source}/media/js/template.js (100%) rename {src => source}/media/vendor/bootstrap-toc/bootstrap-toc.css (100%) rename {src => source}/media/vendor/bootstrap-toc/bootstrap-toc.js (100%) rename {src => source}/media/vendor/bootstrap-toc/index.html (100%) rename {src => source}/media/vendor/fa7free/css/all.min.css (100%) rename {src => source}/media/vendor/fa7free/css/brands.min.css (100%) rename {src => source}/media/vendor/fa7free/css/fontawesome.min.css (100%) rename {src => source}/media/vendor/fa7free/css/regular.min.css (100%) rename {src => source}/media/vendor/fa7free/css/solid.min.css (100%) rename {src => source}/media/vendor/fa7free/webfonts/fa-brands-400.woff2 (100%) rename {src => source}/media/vendor/fa7free/webfonts/fa-regular-400.woff2 (100%) rename {src => source}/media/vendor/fa7free/webfonts/fa-solid-900.woff2 (100%) rename {src => source}/media/vendor/fa7free/webfonts/fa-v4compatibility.woff2 (100%) rename {src => source}/media/vendor/index.html (100%) rename {src => source}/offline.php (100%) rename {src => source}/script.php (100%) rename {src => source}/sync_custom_vars.php (100%) rename {src => source}/templateDetails.xml (100%) rename {src => source}/templates/brand-showcase.html (100%) rename {src => source}/templates/dark.custom.css (100%) rename {src => source}/templates/light.custom.css (100%) diff --git a/src/.build-trigger b/source/.build-trigger similarity index 100% rename from src/.build-trigger rename to source/.build-trigger diff --git a/src/component.php b/source/component.php similarity index 100% rename from src/component.php rename to source/component.php diff --git a/src/custom.php b/source/custom.php similarity index 100% rename from src/custom.php rename to source/custom.php diff --git a/src/error.php b/source/error.php similarity index 100% rename from src/error.php rename to source/error.php diff --git a/src/helper/favicon.php b/source/helper/favicon.php similarity index 100% rename from src/helper/favicon.php rename to source/helper/favicon.php diff --git a/src/helper/index.html b/source/helper/index.html similarity index 100% rename from src/helper/index.html rename to source/helper/index.html diff --git a/src/helper/migrate.php b/source/helper/migrate.php similarity index 100% rename from src/helper/migrate.php rename to source/helper/migrate.php diff --git a/src/helper/minify.php b/source/helper/minify.php similarity index 100% rename from src/helper/minify.php rename to source/helper/minify.php diff --git a/src/html/com_content/article/index.html b/source/html/com_content/article/index.html similarity index 100% rename from src/html/com_content/article/index.html rename to source/html/com_content/article/index.html diff --git a/src/html/com_content/article/toc-left.php b/source/html/com_content/article/toc-left.php similarity index 100% rename from src/html/com_content/article/toc-left.php rename to source/html/com_content/article/toc-left.php diff --git a/src/html/com_content/article/toc-right.php b/source/html/com_content/article/toc-right.php similarity index 100% rename from src/html/com_content/article/toc-right.php rename to source/html/com_content/article/toc-right.php diff --git a/src/html/layouts/joomla/module/card.php b/source/html/layouts/joomla/module/card.php similarity index 100% rename from src/html/layouts/joomla/module/card.php rename to source/html/layouts/joomla/module/card.php diff --git a/src/html/layouts/joomla/module/index.html b/source/html/layouts/joomla/module/index.html similarity index 100% rename from src/html/layouts/joomla/module/index.html rename to source/html/layouts/joomla/module/index.html diff --git a/src/html/layouts/mokoonyx/article-metadata.php b/source/html/layouts/mokoonyx/article-metadata.php similarity index 100% rename from src/html/layouts/mokoonyx/article-metadata.php rename to source/html/layouts/mokoonyx/article-metadata.php diff --git a/src/html/layouts/mokoonyx/index.html b/source/html/layouts/mokoonyx/index.html similarity index 100% rename from src/html/layouts/mokoonyx/index.html rename to source/html/layouts/mokoonyx/index.html diff --git a/src/html/layouts/mokoonyx/social-icons.php b/source/html/layouts/mokoonyx/social-icons.php similarity index 100% rename from src/html/layouts/mokoonyx/social-icons.php rename to source/html/layouts/mokoonyx/social-icons.php diff --git a/src/html/mod_articles_archive/default.php b/source/html/mod_articles_archive/default.php similarity index 100% rename from src/html/mod_articles_archive/default.php rename to source/html/mod_articles_archive/default.php diff --git a/src/html/mod_articles_archive/index.html b/source/html/mod_articles_archive/index.html similarity index 100% rename from src/html/mod_articles_archive/index.html rename to source/html/mod_articles_archive/index.html diff --git a/src/html/mod_articles_categories/default.php b/source/html/mod_articles_categories/default.php similarity index 100% rename from src/html/mod_articles_categories/default.php rename to source/html/mod_articles_categories/default.php diff --git a/src/html/mod_articles_categories/index.html b/source/html/mod_articles_categories/index.html similarity index 100% rename from src/html/mod_articles_categories/index.html rename to source/html/mod_articles_categories/index.html diff --git a/src/html/mod_articles_category/default.php b/source/html/mod_articles_category/default.php similarity index 100% rename from src/html/mod_articles_category/default.php rename to source/html/mod_articles_category/default.php diff --git a/src/html/mod_articles_category/index.html b/source/html/mod_articles_category/index.html similarity index 100% rename from src/html/mod_articles_category/index.html rename to source/html/mod_articles_category/index.html diff --git a/src/html/mod_articles_latest/default.php b/source/html/mod_articles_latest/default.php similarity index 100% rename from src/html/mod_articles_latest/default.php rename to source/html/mod_articles_latest/default.php diff --git a/src/html/mod_articles_latest/index.html b/source/html/mod_articles_latest/index.html similarity index 100% rename from src/html/mod_articles_latest/index.html rename to source/html/mod_articles_latest/index.html diff --git a/src/html/mod_articles_news/default.php b/source/html/mod_articles_news/default.php similarity index 100% rename from src/html/mod_articles_news/default.php rename to source/html/mod_articles_news/default.php diff --git a/src/html/mod_articles_news/index.html b/source/html/mod_articles_news/index.html similarity index 100% rename from src/html/mod_articles_news/index.html rename to source/html/mod_articles_news/index.html diff --git a/src/html/mod_articles_popular/default.php b/source/html/mod_articles_popular/default.php similarity index 100% rename from src/html/mod_articles_popular/default.php rename to source/html/mod_articles_popular/default.php diff --git a/src/html/mod_articles_popular/index.html b/source/html/mod_articles_popular/index.html similarity index 100% rename from src/html/mod_articles_popular/index.html rename to source/html/mod_articles_popular/index.html diff --git a/src/html/mod_banners/default.php b/source/html/mod_banners/default.php similarity index 100% rename from src/html/mod_banners/default.php rename to source/html/mod_banners/default.php diff --git a/src/html/mod_banners/index.html b/source/html/mod_banners/index.html similarity index 100% rename from src/html/mod_banners/index.html rename to source/html/mod_banners/index.html diff --git a/src/html/mod_breadcrumbs/default.php b/source/html/mod_breadcrumbs/default.php similarity index 100% rename from src/html/mod_breadcrumbs/default.php rename to source/html/mod_breadcrumbs/default.php diff --git a/src/html/mod_breadcrumbs/index.html b/source/html/mod_breadcrumbs/index.html similarity index 100% rename from src/html/mod_breadcrumbs/index.html rename to source/html/mod_breadcrumbs/index.html diff --git a/src/html/mod_cblogin/default.php b/source/html/mod_cblogin/default.php similarity index 100% rename from src/html/mod_cblogin/default.php rename to source/html/mod_cblogin/default.php diff --git a/src/html/mod_cblogin/default_logout.php b/source/html/mod_cblogin/default_logout.php similarity index 100% rename from src/html/mod_cblogin/default_logout.php rename to source/html/mod_cblogin/default_logout.php diff --git a/src/html/mod_cblogin/index.html b/source/html/mod_cblogin/index.html similarity index 100% rename from src/html/mod_cblogin/index.html rename to source/html/mod_cblogin/index.html diff --git a/src/html/mod_comprofilermoderator/default.php b/source/html/mod_comprofilermoderator/default.php similarity index 100% rename from src/html/mod_comprofilermoderator/default.php rename to source/html/mod_comprofilermoderator/default.php diff --git a/src/html/mod_comprofilermoderator/index.html b/source/html/mod_comprofilermoderator/index.html similarity index 100% rename from src/html/mod_comprofilermoderator/index.html rename to source/html/mod_comprofilermoderator/index.html diff --git a/src/html/mod_comprofileronline/default.php b/source/html/mod_comprofileronline/default.php similarity index 100% rename from src/html/mod_comprofileronline/default.php rename to source/html/mod_comprofileronline/default.php diff --git a/src/html/mod_comprofileronline/index.html b/source/html/mod_comprofileronline/index.html similarity index 100% rename from src/html/mod_comprofileronline/index.html rename to source/html/mod_comprofileronline/index.html diff --git a/src/html/mod_custom/default.php b/source/html/mod_custom/default.php similarity index 100% rename from src/html/mod_custom/default.php rename to source/html/mod_custom/default.php diff --git a/src/html/mod_custom/hero.php b/source/html/mod_custom/hero.php similarity index 100% rename from src/html/mod_custom/hero.php rename to source/html/mod_custom/hero.php diff --git a/src/html/mod_dpcalendar_counter/default.php b/source/html/mod_dpcalendar_counter/default.php similarity index 100% rename from src/html/mod_dpcalendar_counter/default.php rename to source/html/mod_dpcalendar_counter/default.php diff --git a/src/html/mod_dpcalendar_counter/index.html b/source/html/mod_dpcalendar_counter/index.html similarity index 100% rename from src/html/mod_dpcalendar_counter/index.html rename to source/html/mod_dpcalendar_counter/index.html diff --git a/src/html/mod_dpcalendar_map/default.php b/source/html/mod_dpcalendar_map/default.php similarity index 100% rename from src/html/mod_dpcalendar_map/default.php rename to source/html/mod_dpcalendar_map/default.php diff --git a/src/html/mod_dpcalendar_map/index.html b/source/html/mod_dpcalendar_map/index.html similarity index 100% rename from src/html/mod_dpcalendar_map/index.html rename to source/html/mod_dpcalendar_map/index.html diff --git a/src/html/mod_dpcalendar_mini/_scripts.php b/source/html/mod_dpcalendar_mini/_scripts.php similarity index 100% rename from src/html/mod_dpcalendar_mini/_scripts.php rename to source/html/mod_dpcalendar_mini/_scripts.php diff --git a/src/html/mod_dpcalendar_mini/default.php b/source/html/mod_dpcalendar_mini/default.php similarity index 100% rename from src/html/mod_dpcalendar_mini/default.php rename to source/html/mod_dpcalendar_mini/default.php diff --git a/src/html/mod_dpcalendar_mini/default_icons.php b/source/html/mod_dpcalendar_mini/default_icons.php similarity index 100% rename from src/html/mod_dpcalendar_mini/default_icons.php rename to source/html/mod_dpcalendar_mini/default_icons.php diff --git a/src/html/mod_dpcalendar_mini/default_map.php b/source/html/mod_dpcalendar_mini/default_map.php similarity index 100% rename from src/html/mod_dpcalendar_mini/default_map.php rename to source/html/mod_dpcalendar_mini/default_map.php diff --git a/src/html/mod_dpcalendar_mini/default_quickadd.php b/source/html/mod_dpcalendar_mini/default_quickadd.php similarity index 100% rename from src/html/mod_dpcalendar_mini/default_quickadd.php rename to source/html/mod_dpcalendar_mini/default_quickadd.php diff --git a/src/html/mod_dpcalendar_mini/index.html b/source/html/mod_dpcalendar_mini/index.html similarity index 100% rename from src/html/mod_dpcalendar_mini/index.html rename to source/html/mod_dpcalendar_mini/index.html diff --git a/src/html/mod_dpcalendar_upcoming/_scripts.php b/source/html/mod_dpcalendar_upcoming/_scripts.php similarity index 100% rename from src/html/mod_dpcalendar_upcoming/_scripts.php rename to source/html/mod_dpcalendar_upcoming/_scripts.php diff --git a/src/html/mod_dpcalendar_upcoming/default.php b/source/html/mod_dpcalendar_upcoming/default.php similarity index 100% rename from src/html/mod_dpcalendar_upcoming/default.php rename to source/html/mod_dpcalendar_upcoming/default.php diff --git a/src/html/mod_dpcalendar_upcoming/index.html b/source/html/mod_dpcalendar_upcoming/index.html similarity index 100% rename from src/html/mod_dpcalendar_upcoming/index.html rename to source/html/mod_dpcalendar_upcoming/index.html diff --git a/src/html/mod_feed/default.php b/source/html/mod_feed/default.php similarity index 100% rename from src/html/mod_feed/default.php rename to source/html/mod_feed/default.php diff --git a/src/html/mod_feed/index.html b/source/html/mod_feed/index.html similarity index 100% rename from src/html/mod_feed/index.html rename to source/html/mod_feed/index.html diff --git a/src/html/mod_finder/default.php b/source/html/mod_finder/default.php similarity index 100% rename from src/html/mod_finder/default.php rename to source/html/mod_finder/default.php diff --git a/src/html/mod_finder/index.html b/source/html/mod_finder/index.html similarity index 100% rename from src/html/mod_finder/index.html rename to source/html/mod_finder/index.html diff --git a/src/html/mod_footer/default.php b/source/html/mod_footer/default.php similarity index 100% rename from src/html/mod_footer/default.php rename to source/html/mod_footer/default.php diff --git a/src/html/mod_footer/index.html b/source/html/mod_footer/index.html similarity index 100% rename from src/html/mod_footer/index.html rename to source/html/mod_footer/index.html diff --git a/src/html/mod_languages/default.php b/source/html/mod_languages/default.php similarity index 100% rename from src/html/mod_languages/default.php rename to source/html/mod_languages/default.php diff --git a/src/html/mod_languages/index.html b/source/html/mod_languages/index.html similarity index 100% rename from src/html/mod_languages/index.html rename to source/html/mod_languages/index.html diff --git a/src/html/mod_login/default.php b/source/html/mod_login/default.php similarity index 100% rename from src/html/mod_login/default.php rename to source/html/mod_login/default.php diff --git a/src/html/mod_login/index.html b/source/html/mod_login/index.html similarity index 100% rename from src/html/mod_login/index.html rename to source/html/mod_login/index.html diff --git a/src/html/mod_menu/default.php b/source/html/mod_menu/default.php similarity index 100% rename from src/html/mod_menu/default.php rename to source/html/mod_menu/default.php diff --git a/src/html/mod_menu/default_component.php b/source/html/mod_menu/default_component.php similarity index 100% rename from src/html/mod_menu/default_component.php rename to source/html/mod_menu/default_component.php diff --git a/src/html/mod_menu/default_heading.php b/source/html/mod_menu/default_heading.php similarity index 100% rename from src/html/mod_menu/default_heading.php rename to source/html/mod_menu/default_heading.php diff --git a/src/html/mod_menu/default_separator.php b/source/html/mod_menu/default_separator.php similarity index 100% rename from src/html/mod_menu/default_separator.php rename to source/html/mod_menu/default_separator.php diff --git a/src/html/mod_menu/default_url.php b/source/html/mod_menu/default_url.php similarity index 100% rename from src/html/mod_menu/default_url.php rename to source/html/mod_menu/default_url.php diff --git a/src/html/mod_menu/horizontal.php b/source/html/mod_menu/horizontal.php similarity index 100% rename from src/html/mod_menu/horizontal.php rename to source/html/mod_menu/horizontal.php diff --git a/src/html/mod_menu/horizontal_component.php b/source/html/mod_menu/horizontal_component.php similarity index 100% rename from src/html/mod_menu/horizontal_component.php rename to source/html/mod_menu/horizontal_component.php diff --git a/src/html/mod_menu/horizontal_heading.php b/source/html/mod_menu/horizontal_heading.php similarity index 100% rename from src/html/mod_menu/horizontal_heading.php rename to source/html/mod_menu/horizontal_heading.php diff --git a/src/html/mod_menu/horizontal_separator.php b/source/html/mod_menu/horizontal_separator.php similarity index 100% rename from src/html/mod_menu/horizontal_separator.php rename to source/html/mod_menu/horizontal_separator.php diff --git a/src/html/mod_menu/horizontal_url.php b/source/html/mod_menu/horizontal_url.php similarity index 100% rename from src/html/mod_menu/horizontal_url.php rename to source/html/mod_menu/horizontal_url.php diff --git a/src/html/mod_menu/index.html b/source/html/mod_menu/index.html similarity index 100% rename from src/html/mod_menu/index.html rename to source/html/mod_menu/index.html diff --git a/src/html/mod_menu/mainmenu.php b/source/html/mod_menu/mainmenu.php similarity index 100% rename from src/html/mod_menu/mainmenu.php rename to source/html/mod_menu/mainmenu.php diff --git a/src/html/mod_menu/mainmenu_component.php b/source/html/mod_menu/mainmenu_component.php similarity index 100% rename from src/html/mod_menu/mainmenu_component.php rename to source/html/mod_menu/mainmenu_component.php diff --git a/src/html/mod_menu/mainmenu_heading.php b/source/html/mod_menu/mainmenu_heading.php similarity index 100% rename from src/html/mod_menu/mainmenu_heading.php rename to source/html/mod_menu/mainmenu_heading.php diff --git a/src/html/mod_menu/mainmenu_separator.php b/source/html/mod_menu/mainmenu_separator.php similarity index 100% rename from src/html/mod_menu/mainmenu_separator.php rename to source/html/mod_menu/mainmenu_separator.php diff --git a/src/html/mod_menu/mainmenu_url.php b/source/html/mod_menu/mainmenu_url.php similarity index 100% rename from src/html/mod_menu/mainmenu_url.php rename to source/html/mod_menu/mainmenu_url.php diff --git a/src/html/mod_random_image/default.php b/source/html/mod_random_image/default.php similarity index 100% rename from src/html/mod_random_image/default.php rename to source/html/mod_random_image/default.php diff --git a/src/html/mod_random_image/index.html b/source/html/mod_random_image/index.html similarity index 100% rename from src/html/mod_random_image/index.html rename to source/html/mod_random_image/index.html diff --git a/src/html/mod_related_items/default.php b/source/html/mod_related_items/default.php similarity index 100% rename from src/html/mod_related_items/default.php rename to source/html/mod_related_items/default.php diff --git a/src/html/mod_related_items/index.html b/source/html/mod_related_items/index.html similarity index 100% rename from src/html/mod_related_items/index.html rename to source/html/mod_related_items/index.html diff --git a/src/html/mod_stats/default.php b/source/html/mod_stats/default.php similarity index 100% rename from src/html/mod_stats/default.php rename to source/html/mod_stats/default.php diff --git a/src/html/mod_stats/index.html b/source/html/mod_stats/index.html similarity index 100% rename from src/html/mod_stats/index.html rename to source/html/mod_stats/index.html diff --git a/src/html/mod_syndicate/default.php b/source/html/mod_syndicate/default.php similarity index 100% rename from src/html/mod_syndicate/default.php rename to source/html/mod_syndicate/default.php diff --git a/src/html/mod_syndicate/index.html b/source/html/mod_syndicate/index.html similarity index 100% rename from src/html/mod_syndicate/index.html rename to source/html/mod_syndicate/index.html diff --git a/src/html/mod_tags_popular/default.php b/source/html/mod_tags_popular/default.php similarity index 100% rename from src/html/mod_tags_popular/default.php rename to source/html/mod_tags_popular/default.php diff --git a/src/html/mod_tags_popular/index.html b/source/html/mod_tags_popular/index.html similarity index 100% rename from src/html/mod_tags_popular/index.html rename to source/html/mod_tags_popular/index.html diff --git a/src/html/mod_tags_similar/default.php b/source/html/mod_tags_similar/default.php similarity index 100% rename from src/html/mod_tags_similar/default.php rename to source/html/mod_tags_similar/default.php diff --git a/src/html/mod_tags_similar/index.html b/source/html/mod_tags_similar/index.html similarity index 100% rename from src/html/mod_tags_similar/index.html rename to source/html/mod_tags_similar/index.html diff --git a/src/html/mod_users_latest/default.php b/source/html/mod_users_latest/default.php similarity index 100% rename from src/html/mod_users_latest/default.php rename to source/html/mod_users_latest/default.php diff --git a/src/html/mod_users_latest/index.html b/source/html/mod_users_latest/index.html similarity index 100% rename from src/html/mod_users_latest/index.html rename to source/html/mod_users_latest/index.html diff --git a/src/html/mod_whosonline/default.php b/source/html/mod_whosonline/default.php similarity index 100% rename from src/html/mod_whosonline/default.php rename to source/html/mod_whosonline/default.php diff --git a/src/html/mod_whosonline/index.html b/source/html/mod_whosonline/index.html similarity index 100% rename from src/html/mod_whosonline/index.html rename to source/html/mod_whosonline/index.html diff --git a/src/html/mod_wrapper/default.php b/source/html/mod_wrapper/default.php similarity index 100% rename from src/html/mod_wrapper/default.php rename to source/html/mod_wrapper/default.php diff --git a/src/html/mod_wrapper/index.html b/source/html/mod_wrapper/index.html similarity index 100% rename from src/html/mod_wrapper/index.html rename to source/html/mod_wrapper/index.html diff --git a/src/index.html b/source/index.html similarity index 100% rename from src/index.html rename to source/index.html diff --git a/src/index.php b/source/index.php similarity index 100% rename from src/index.php rename to source/index.php diff --git a/src/joomla.asset.json b/source/joomla.asset.json similarity index 100% rename from src/joomla.asset.json rename to source/joomla.asset.json diff --git a/src/language/en-GB/index.html b/source/language/en-GB/index.html similarity index 100% rename from src/language/en-GB/index.html rename to source/language/en-GB/index.html diff --git a/src/language/en-GB/tpl_mokoonyx.ini b/source/language/en-GB/tpl_mokoonyx.ini similarity index 100% rename from src/language/en-GB/tpl_mokoonyx.ini rename to source/language/en-GB/tpl_mokoonyx.ini diff --git a/src/language/en-GB/tpl_mokoonyx.sys.ini b/source/language/en-GB/tpl_mokoonyx.sys.ini similarity index 100% rename from src/language/en-GB/tpl_mokoonyx.sys.ini rename to source/language/en-GB/tpl_mokoonyx.sys.ini diff --git a/src/language/en-US/index.html b/source/language/en-US/index.html similarity index 100% rename from src/language/en-US/index.html rename to source/language/en-US/index.html diff --git a/src/language/en-US/tpl_mokoonyx.ini b/source/language/en-US/tpl_mokoonyx.ini similarity index 100% rename from src/language/en-US/tpl_mokoonyx.ini rename to source/language/en-US/tpl_mokoonyx.ini diff --git a/src/language/en-US/tpl_mokoonyx.sys.ini b/source/language/en-US/tpl_mokoonyx.sys.ini similarity index 100% rename from src/language/en-US/tpl_mokoonyx.sys.ini rename to source/language/en-US/tpl_mokoonyx.sys.ini diff --git a/src/language/index.html b/source/language/index.html similarity index 100% rename from src/language/index.html rename to source/language/index.html diff --git a/src/media/css/a11y-high-contrast.css b/source/media/css/a11y-high-contrast.css similarity index 100% rename from src/media/css/a11y-high-contrast.css rename to source/media/css/a11y-high-contrast.css diff --git a/src/media/css/component.css b/source/media/css/component.css similarity index 100% rename from src/media/css/component.css rename to source/media/css/component.css diff --git a/src/media/css/editor.css b/source/media/css/editor.css similarity index 100% rename from src/media/css/editor.css rename to source/media/css/editor.css diff --git a/src/media/css/fonts/osaka.css b/source/media/css/fonts/osaka.css similarity index 100% rename from src/media/css/fonts/osaka.css rename to source/media/css/fonts/osaka.css diff --git a/src/media/css/fonts/roboto.css b/source/media/css/fonts/roboto.css similarity index 100% rename from src/media/css/fonts/roboto.css rename to source/media/css/fonts/roboto.css diff --git a/src/media/css/index.html b/source/media/css/index.html similarity index 100% rename from src/media/css/index.html rename to source/media/css/index.html diff --git a/src/media/css/offline.css b/source/media/css/offline.css similarity index 100% rename from src/media/css/offline.css rename to source/media/css/offline.css diff --git a/src/media/css/system/index.html b/source/media/css/system/index.html similarity index 100% rename from src/media/css/system/index.html rename to source/media/css/system/index.html diff --git a/src/media/css/system/searchtools/index.html b/source/media/css/system/searchtools/index.html similarity index 100% rename from src/media/css/system/searchtools/index.html rename to source/media/css/system/searchtools/index.html diff --git a/src/media/css/system/searchtools/searchtools.css b/source/media/css/system/searchtools/searchtools.css similarity index 100% rename from src/media/css/system/searchtools/searchtools.css rename to source/media/css/system/searchtools/searchtools.css diff --git a/src/media/css/template-rtl.css b/source/media/css/template-rtl.css similarity index 100% rename from src/media/css/template-rtl.css rename to source/media/css/template-rtl.css diff --git a/src/media/css/template.css b/source/media/css/template.css similarity index 100% rename from src/media/css/template.css rename to source/media/css/template.css diff --git a/src/media/css/theme/dark.standard.css b/source/media/css/theme/dark.standard.css similarity index 100% rename from src/media/css/theme/dark.standard.css rename to source/media/css/theme/dark.standard.css diff --git a/src/media/css/theme/index.html b/source/media/css/theme/index.html similarity index 100% rename from src/media/css/theme/index.html rename to source/media/css/theme/index.html diff --git a/src/media/css/theme/light.standard.css b/source/media/css/theme/light.standard.css similarity index 100% rename from src/media/css/theme/light.standard.css rename to source/media/css/theme/light.standard.css diff --git a/src/media/fonts/index.html b/source/media/fonts/index.html similarity index 100% rename from src/media/fonts/index.html rename to source/media/fonts/index.html diff --git a/src/media/fonts/osaka-re.woff b/source/media/fonts/osaka-re.woff similarity index 100% rename from src/media/fonts/osaka-re.woff rename to source/media/fonts/osaka-re.woff diff --git a/src/media/fonts/roboto-v51-latin-100.woff2 b/source/media/fonts/roboto-v51-latin-100.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-100.woff2 rename to source/media/fonts/roboto-v51-latin-100.woff2 diff --git a/src/media/fonts/roboto-v51-latin-100italic.woff2 b/source/media/fonts/roboto-v51-latin-100italic.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-100italic.woff2 rename to source/media/fonts/roboto-v51-latin-100italic.woff2 diff --git a/src/media/fonts/roboto-v51-latin-200.woff2 b/source/media/fonts/roboto-v51-latin-200.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-200.woff2 rename to source/media/fonts/roboto-v51-latin-200.woff2 diff --git a/src/media/fonts/roboto-v51-latin-200italic.woff2 b/source/media/fonts/roboto-v51-latin-200italic.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-200italic.woff2 rename to source/media/fonts/roboto-v51-latin-200italic.woff2 diff --git a/src/media/fonts/roboto-v51-latin-300.woff2 b/source/media/fonts/roboto-v51-latin-300.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-300.woff2 rename to source/media/fonts/roboto-v51-latin-300.woff2 diff --git a/src/media/fonts/roboto-v51-latin-300italic.woff2 b/source/media/fonts/roboto-v51-latin-300italic.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-300italic.woff2 rename to source/media/fonts/roboto-v51-latin-300italic.woff2 diff --git a/src/media/fonts/roboto-v51-latin-500.woff2 b/source/media/fonts/roboto-v51-latin-500.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-500.woff2 rename to source/media/fonts/roboto-v51-latin-500.woff2 diff --git a/src/media/fonts/roboto-v51-latin-500italic.woff2 b/source/media/fonts/roboto-v51-latin-500italic.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-500italic.woff2 rename to source/media/fonts/roboto-v51-latin-500italic.woff2 diff --git a/src/media/fonts/roboto-v51-latin-600.woff2 b/source/media/fonts/roboto-v51-latin-600.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-600.woff2 rename to source/media/fonts/roboto-v51-latin-600.woff2 diff --git a/src/media/fonts/roboto-v51-latin-600italic.woff2 b/source/media/fonts/roboto-v51-latin-600italic.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-600italic.woff2 rename to source/media/fonts/roboto-v51-latin-600italic.woff2 diff --git a/src/media/fonts/roboto-v51-latin-700.woff2 b/source/media/fonts/roboto-v51-latin-700.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-700.woff2 rename to source/media/fonts/roboto-v51-latin-700.woff2 diff --git a/src/media/fonts/roboto-v51-latin-700italic.woff2 b/source/media/fonts/roboto-v51-latin-700italic.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-700italic.woff2 rename to source/media/fonts/roboto-v51-latin-700italic.woff2 diff --git a/src/media/fonts/roboto-v51-latin-800.woff2 b/source/media/fonts/roboto-v51-latin-800.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-800.woff2 rename to source/media/fonts/roboto-v51-latin-800.woff2 diff --git a/src/media/fonts/roboto-v51-latin-800italic.woff2 b/source/media/fonts/roboto-v51-latin-800italic.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-800italic.woff2 rename to source/media/fonts/roboto-v51-latin-800italic.woff2 diff --git a/src/media/fonts/roboto-v51-latin-900.woff2 b/source/media/fonts/roboto-v51-latin-900.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-900.woff2 rename to source/media/fonts/roboto-v51-latin-900.woff2 diff --git a/src/media/fonts/roboto-v51-latin-900italic.woff2 b/source/media/fonts/roboto-v51-latin-900italic.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-900italic.woff2 rename to source/media/fonts/roboto-v51-latin-900italic.woff2 diff --git a/src/media/fonts/roboto-v51-latin-italic.woff2 b/source/media/fonts/roboto-v51-latin-italic.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-italic.woff2 rename to source/media/fonts/roboto-v51-latin-italic.woff2 diff --git a/src/media/fonts/roboto-v51-latin-regular.woff2 b/source/media/fonts/roboto-v51-latin-regular.woff2 similarity index 100% rename from src/media/fonts/roboto-v51-latin-regular.woff2 rename to source/media/fonts/roboto-v51-latin-regular.woff2 diff --git a/src/media/images/bg.svg b/source/media/images/bg.svg similarity index 100% rename from src/media/images/bg.svg rename to source/media/images/bg.svg diff --git a/src/media/images/hero.jpg b/source/media/images/hero.jpg similarity index 100% rename from src/media/images/hero.jpg rename to source/media/images/hero.jpg diff --git a/src/media/images/index.html b/source/media/images/index.html similarity index 100% rename from src/media/images/index.html rename to source/media/images/index.html diff --git a/src/media/images/select-bg-active-rtl.svg b/source/media/images/select-bg-active-rtl.svg similarity index 100% rename from src/media/images/select-bg-active-rtl.svg rename to source/media/images/select-bg-active-rtl.svg diff --git a/src/media/images/select-bg-active.svg b/source/media/images/select-bg-active.svg similarity index 100% rename from src/media/images/select-bg-active.svg rename to source/media/images/select-bg-active.svg diff --git a/src/media/images/select-bg-rtl.svg b/source/media/images/select-bg-rtl.svg similarity index 100% rename from src/media/images/select-bg-rtl.svg rename to source/media/images/select-bg-rtl.svg diff --git a/src/media/images/select-bg.svg b/source/media/images/select-bg.svg similarity index 100% rename from src/media/images/select-bg.svg rename to source/media/images/select-bg.svg diff --git a/src/media/images/template_thumbnail.png b/source/media/images/template_thumbnail.png similarity index 100% rename from src/media/images/template_thumbnail.png rename to source/media/images/template_thumbnail.png diff --git a/src/media/index.html b/source/media/index.html similarity index 100% rename from src/media/index.html rename to source/media/index.html diff --git a/src/media/js/gtm.js b/source/media/js/gtm.js similarity index 100% rename from src/media/js/gtm.js rename to source/media/js/gtm.js diff --git a/src/media/js/index.html b/source/media/js/index.html similarity index 100% rename from src/media/js/index.html rename to source/media/js/index.html diff --git a/src/media/js/mod_menu/index.html b/source/media/js/mod_menu/index.html similarity index 100% rename from src/media/js/mod_menu/index.html rename to source/media/js/mod_menu/index.html diff --git a/src/media/js/mod_menu/menu-metismenu-es5.js b/source/media/js/mod_menu/menu-metismenu-es5.js similarity index 100% rename from src/media/js/mod_menu/menu-metismenu-es5.js rename to source/media/js/mod_menu/menu-metismenu-es5.js diff --git a/src/media/js/mod_menu/menu-metismenu.js b/source/media/js/mod_menu/menu-metismenu.js similarity index 100% rename from src/media/js/mod_menu/menu-metismenu.js rename to source/media/js/mod_menu/menu-metismenu.js diff --git a/src/media/js/template.js b/source/media/js/template.js similarity index 100% rename from src/media/js/template.js rename to source/media/js/template.js diff --git a/src/media/vendor/bootstrap-toc/bootstrap-toc.css b/source/media/vendor/bootstrap-toc/bootstrap-toc.css similarity index 100% rename from src/media/vendor/bootstrap-toc/bootstrap-toc.css rename to source/media/vendor/bootstrap-toc/bootstrap-toc.css diff --git a/src/media/vendor/bootstrap-toc/bootstrap-toc.js b/source/media/vendor/bootstrap-toc/bootstrap-toc.js similarity index 100% rename from src/media/vendor/bootstrap-toc/bootstrap-toc.js rename to source/media/vendor/bootstrap-toc/bootstrap-toc.js diff --git a/src/media/vendor/bootstrap-toc/index.html b/source/media/vendor/bootstrap-toc/index.html similarity index 100% rename from src/media/vendor/bootstrap-toc/index.html rename to source/media/vendor/bootstrap-toc/index.html diff --git a/src/media/vendor/fa7free/css/all.min.css b/source/media/vendor/fa7free/css/all.min.css similarity index 100% rename from src/media/vendor/fa7free/css/all.min.css rename to source/media/vendor/fa7free/css/all.min.css diff --git a/src/media/vendor/fa7free/css/brands.min.css b/source/media/vendor/fa7free/css/brands.min.css similarity index 100% rename from src/media/vendor/fa7free/css/brands.min.css rename to source/media/vendor/fa7free/css/brands.min.css diff --git a/src/media/vendor/fa7free/css/fontawesome.min.css b/source/media/vendor/fa7free/css/fontawesome.min.css similarity index 100% rename from src/media/vendor/fa7free/css/fontawesome.min.css rename to source/media/vendor/fa7free/css/fontawesome.min.css diff --git a/src/media/vendor/fa7free/css/regular.min.css b/source/media/vendor/fa7free/css/regular.min.css similarity index 100% rename from src/media/vendor/fa7free/css/regular.min.css rename to source/media/vendor/fa7free/css/regular.min.css diff --git a/src/media/vendor/fa7free/css/solid.min.css b/source/media/vendor/fa7free/css/solid.min.css similarity index 100% rename from src/media/vendor/fa7free/css/solid.min.css rename to source/media/vendor/fa7free/css/solid.min.css diff --git a/src/media/vendor/fa7free/webfonts/fa-brands-400.woff2 b/source/media/vendor/fa7free/webfonts/fa-brands-400.woff2 similarity index 100% rename from src/media/vendor/fa7free/webfonts/fa-brands-400.woff2 rename to source/media/vendor/fa7free/webfonts/fa-brands-400.woff2 diff --git a/src/media/vendor/fa7free/webfonts/fa-regular-400.woff2 b/source/media/vendor/fa7free/webfonts/fa-regular-400.woff2 similarity index 100% rename from src/media/vendor/fa7free/webfonts/fa-regular-400.woff2 rename to source/media/vendor/fa7free/webfonts/fa-regular-400.woff2 diff --git a/src/media/vendor/fa7free/webfonts/fa-solid-900.woff2 b/source/media/vendor/fa7free/webfonts/fa-solid-900.woff2 similarity index 100% rename from src/media/vendor/fa7free/webfonts/fa-solid-900.woff2 rename to source/media/vendor/fa7free/webfonts/fa-solid-900.woff2 diff --git a/src/media/vendor/fa7free/webfonts/fa-v4compatibility.woff2 b/source/media/vendor/fa7free/webfonts/fa-v4compatibility.woff2 similarity index 100% rename from src/media/vendor/fa7free/webfonts/fa-v4compatibility.woff2 rename to source/media/vendor/fa7free/webfonts/fa-v4compatibility.woff2 diff --git a/src/media/vendor/index.html b/source/media/vendor/index.html similarity index 100% rename from src/media/vendor/index.html rename to source/media/vendor/index.html diff --git a/src/offline.php b/source/offline.php similarity index 100% rename from src/offline.php rename to source/offline.php diff --git a/src/script.php b/source/script.php similarity index 100% rename from src/script.php rename to source/script.php diff --git a/src/sync_custom_vars.php b/source/sync_custom_vars.php similarity index 100% rename from src/sync_custom_vars.php rename to source/sync_custom_vars.php diff --git a/src/templateDetails.xml b/source/templateDetails.xml similarity index 100% rename from src/templateDetails.xml rename to source/templateDetails.xml diff --git a/src/templates/brand-showcase.html b/source/templates/brand-showcase.html similarity index 100% rename from src/templates/brand-showcase.html rename to source/templates/brand-showcase.html diff --git a/src/templates/dark.custom.css b/source/templates/dark.custom.css similarity index 100% rename from src/templates/dark.custom.css rename to source/templates/dark.custom.css diff --git a/src/templates/light.custom.css b/source/templates/light.custom.css similarity index 100% rename from src/templates/light.custom.css rename to source/templates/light.custom.css -- 2.52.0 From 4804f30163db0cb35123b8f4fe7dbdfa1104e5eb Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 20 Jun 2026 13:57:53 -0500 Subject: [PATCH 13/13] fix: reorder footer social icons below menu and footer modules Moved the social icons block after footer-menu and footer module positions for correct visual stacking order. Also removed unused ci-issue-reporter.sh script. --- CHANGELOG.md | 6 + automation/ci-issue-reporter.sh | 237 -------------------------------- source/index.php | 11 +- 3 files changed, 12 insertions(+), 242 deletions(-) delete mode 100644 automation/ci-issue-reporter.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index c20693c..bf294c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,12 @@ ## [Unreleased] +### Fixed +- Moved footer social icons below footer-menu and footer module positions for correct display order + +### Removed +- Removed unused `automation/ci-issue-reporter.sh` + ## [02.22.00] --- 2026-06-18 ### Fixed diff --git a/automation/ci-issue-reporter.sh b/automation/ci-issue-reporter.sh deleted file mode 100644 index 65c47ba..0000000 --- a/automation/ci-issue-reporter.sh +++ /dev/null @@ -1,237 +0,0 @@ -#!/usr/bin/env bash -# ============================================================================ -# Copyright (C) 2026 Moko Consulting -# -# SPDX-License-Identifier: GPL-3.0-or-later -# -# FILE INFORMATION -# DEFGROUP: Automation.CI -# INGROUP: moko-platform.Automation -# REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform -# PATH: /automation/ci-issue-reporter.sh -# VERSION: 09.23.00 -# BRIEF: Creates or updates a Gitea issue when a CI gate fails. -# Deduplicates by searching open issues with the "ci-auto" label -# whose title matches the gate. If a matching issue exists, a comment -# is appended instead of opening a duplicate. -# ============================================================================ - -set -euo pipefail - -# ── Defaults ──────────────────────────────────────────────────────────────── -GITEA_URL="${GITEA_URL:-https://git.mokoconsulting.tech}" -GITEA_TOKEN="${GITEA_TOKEN:-}" -REPO="${GITHUB_REPOSITORY:-}" -RUN_URL="${GITHUB_SERVER_URL:-${GITEA_URL}}/${REPO}/actions/runs/${GITHUB_RUN_ID:-0}" -LABEL_NAME="ci-auto" -LABEL_COLOR="#e11d48" - -GATE="" -DETAILS="" -SEVERITY="error" -WORKFLOW="" - -# ── Parse arguments ───────────────────────────────────────────────────────── -usage() { - cat </dev/null || echo "000") - - if [[ "$exists" == "200" ]]; then - # Check if label already exists - local found - found=$(curl -sf \ - -H "Authorization: token ${GITEA_TOKEN}" \ - "${API}/labels" 2>/dev/null \ - | grep -o "\"name\":\"${LABEL_NAME}\"" || true) - - if [[ -z "$found" ]]; then - curl -sf -X POST \ - -H "Authorization: token ${GITEA_TOKEN}" \ - -H "Content-Type: application/json" \ - "${API}/labels" \ - -d "{\"name\":\"${LABEL_NAME}\",\"color\":\"${LABEL_COLOR}\",\"description\":\"Auto-created by CI issue reporter\"}" \ - > /dev/null 2>&1 || true - fi - fi -} - -# ── Search for existing open issue ────────────────────────────────────────── -find_existing_issue() { - # URL-encode the gate name for the query - local query - query=$(printf '%s' "[CI] ${GATE}" | sed 's/ /%20/g; s/\[/%5B/g; s/\]/%5D/g') - - local response - response=$(curl -sf \ - -H "Authorization: token ${GITEA_TOKEN}" \ - "${API}/issues?type=issues&state=open&labels=${LABEL_NAME}&q=${query}&limit=5" \ - 2>/dev/null || echo "[]") - - # Extract the first matching issue number - echo "$response" \ - | grep -oP '"number":\s*\K[0-9]+' \ - | head -1 -} - -# ── Build issue body ──────────────────────────────────────────────────────── -build_body() { - local severity_badge - if [[ "$SEVERITY" == "error" ]]; then - severity_badge="**Severity:** Error" - else - severity_badge="**Severity:** Warning" - fi - - cat </dev/null) - - HTTP=$(curl -sf -o /dev/null -w '%{http_code}' -X POST \ - -H "Authorization: token ${GITEA_TOKEN}" \ - -H "Content-Type: application/json" \ - "${API}/issues/${EXISTING}/comments" \ - -d "${COMMENT_JSON}" 2>/dev/null || echo "000") - - if [[ "$HTTP" == "201" ]]; then - echo "Commented on existing issue #${EXISTING}" - else - echo "WARNING: Failed to comment on issue #${EXISTING} (HTTP ${HTTP})" - fi -else - # Create new issue - ISSUE_BODY=$(build_body) - ISSUE_JSON=$(python3 -c " -import sys, json -body = sys.stdin.read() -print(json.dumps({ - 'title': sys.argv[1], - 'body': body, - 'labels': [] -}))" "$TITLE" <<< "$ISSUE_BODY" 2>/dev/null) - - # Create the issue - RESPONSE=$(curl -sf -X POST \ - -H "Authorization: token ${GITEA_TOKEN}" \ - -H "Content-Type: application/json" \ - "${API}/issues" \ - -d "${ISSUE_JSON}" 2>/dev/null || echo "{}") - - ISSUE_NUM=$(echo "$RESPONSE" | grep -oP '"number":\s*\K[0-9]+' | head -1) - - if [[ -n "$ISSUE_NUM" ]]; then - # Apply label (separate call — more reliable across Gitea versions) - LABEL_ID=$(curl -sf \ - -H "Authorization: token ${GITEA_TOKEN}" \ - "${API}/labels" 2>/dev/null \ - | grep -oP "\"id\":\s*\K[0-9]+(?=[^}]*\"name\":\s*\"${LABEL_NAME}\")" \ - | head -1 || true) - - if [[ -n "$LABEL_ID" ]]; then - curl -sf -X POST \ - -H "Authorization: token ${GITEA_TOKEN}" \ - -H "Content-Type: application/json" \ - "${API}/issues/${ISSUE_NUM}/labels" \ - -d "{\"labels\":[${LABEL_ID}]}" \ - > /dev/null 2>&1 || true - fi - - echo "Created issue #${ISSUE_NUM}: ${TITLE}" - else - echo "WARNING: Failed to create issue" - echo "Response: ${RESPONSE}" - fi -fi diff --git a/source/index.php b/source/index.php index 9345cbb..6623555 100644 --- a/source/index.php +++ b/source/index.php @@ -593,11 +593,7 @@ $wa->useScript('user.js'); // js/user.js
- params->get('social_footer')) : ?> - - + countModules('footer-menu', true)) : ?> + params->get('social_footer')) : ?> + +
params->get('social_floating')) : -- 2.52.0