From 271fef53bd19e23e39613c541562afd0f19375a4 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Thu, 23 Apr 2026 14:59:30 -0500 Subject: [PATCH 1/5] docs: update docs for MokoOnyx switch and cascade channels - Replace MokoCassiopeia references with MokoOnyx in testing guide - Add cascade release channels and sync-to-main documentation Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/guides/testing-guide.md | 6 +++--- docs/update-server.md | 40 ++++++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/docs/guides/testing-guide.md b/docs/guides/testing-guide.md index 11491f7..1646dee 100644 --- a/docs/guides/testing-guide.md +++ b/docs/guides/testing-guide.md @@ -41,7 +41,7 @@ | 4 | Check admin dashboard | "Welcome to MokoWaaS!" appears in control panel | [ ] | | 5 | Check admin footer | "Powered by MokoWaaS" appears | [ ] | | 6 | Check admin login page | "MokoWaaS Administrator Login" title, support links show "Moko Consulting" | [ ] | -| 7 | Check frontend footer | "Powered by MokoWaaS" in Cassiopeia template | [ ] | +| 7 | Check frontend footer | "Powered by MokoWaaS" in MokoOnyx template | [ ] | | 8 | Check Joomla override files at `administrator/language/overrides/en-GB.override.ini` | Contains `BEGIN MokoWaaS Overrides` sentinel block | [ ] | | 9 | Check Joomla override files at `language/overrides/en-GB.override.ini` | Contains `BEGIN MokoWaaS Overrides` sentinel block | [ ] | @@ -87,7 +87,7 @@ |---|------|-----------------|------| | 1 | Set Enable Branding to "No", save | Save succeeds | [ ] | | 2 | Reload admin dashboard | Default Joomla strings appear (e.g., "Welcome to Joomla!") | [ ] | -| 3 | Check frontend footer | Default "Powered by Joomla" or Cassiopeia default | [ ] | +| 3 | Check frontend footer | Default "Powered by Joomla" or MokoOnyx default | [ ] | | 4 | Set Enable Branding back to "Yes", save | Branding strings restored immediately | [ ] | ### 2.7 Update (Upgrade from Previous Version) @@ -138,7 +138,7 @@ Verify the following admin areas no longer show "Joomla": | # | Location | Expected Brand Text | Pass | |---|----------|-------------------|------| -| 1 | Cassiopeia footer | "Powered by {brand}" | [ ] | +| 1 | MokoOnyx footer | "Powered by {brand}" | [ ] | | 2 | Site offline page | Maintenance message (no Joomla reference) | [ ] | | 3 | 404 error page | "Page Not Found" (no Joomla reference) | [ ] | | 4 | Frontend login support | "{company} Support" / "{brand} Documentation" | [ ] | diff --git a/docs/update-server.md b/docs/update-server.md index a149658..5bfe032 100644 --- a/docs/update-server.md +++ b/docs/update-server.md @@ -29,8 +29,30 @@ Joomla checks for extension updates by fetching an XML file from the URL defined | Event | Workflow | `` | `` | |-------|----------|---------|-------------| | Merge to `main` | `auto-release.yml` | `stable` | `XX.YY.ZZ` | -| Push to `dev/**` | `deploy-dev.yml` | `development` | `development` | -| Push to `rc/**` | `deploy-dev.yml` | `rc` | `XX.YY.ZZ-rc` | +| Push to `dev` or `dev/**` | `update-server.yml` | `development` | `XX.YY.ZZ-dev` | +| Push to `alpha/**` | `update-server.yml` | `alpha` | `XX.YY.ZZ-alpha` | +| Push to `beta/**` | `update-server.yml` | `beta` | `XX.YY.ZZ-beta` | +| Push to `rc/**` | `update-server.yml` | `rc` | `XX.YY.ZZ-rc` | + +**Trigger behavior**: `update-server.yml` triggers on both direct pushes and PR merges to `dev`, `dev/**`, `alpha/**`, `beta/**`, and `rc/**` branches. It supports bare `dev` branches (not just `dev/**` patterns). + +### Cascade Release Channels + +Each stability level writes itself **and all lower channels** to `updates.xml`: + +| Release Stream | Channels written | +|---------------|-----------------| +| development | `development` | +| alpha | `development`, `alpha` | +| beta | `development`, `alpha`, `beta` | +| rc | `development`, `alpha`, `beta`, `rc` | +| stable | `development`, `alpha`, `beta`, `rc`, `stable` | + +This ensures Joomla sites on any "Minimum Stability" setting always see the latest available release. + +### Sync to Main + +Since Joomla sites read `updates.xml` from the `main` branch, the `update-server.yml` workflow **syncs `updates.xml` to `main` via the Gitea API** after building on non-main branches. This ensures pre-release channel entries are visible to sites checking for updates without requiring a PR merge to main. ### Generated XML Structure @@ -94,14 +116,16 @@ Your XML manifest must include an `` tag pointing to the `update. ### Branch Lifecycle ``` -dev/XX.YY.ZZ → rc/XX.YY.ZZ → main → version/XX.YY -(development) (rc) (stable) (frozen snapshot) +dev → [alpha] → [beta] → rc → version/XX → main → dev + optional optional (integration) (production) (feedback) ``` -1. **Development** (`dev/**`): `update.xml` with `development`, download points to branch archive -2. **Release Candidate** (`rc/**`): `update.xml` with `rc`, version set to `XX.YY.ZZ-rc` -3. **Stable Release** (merge to `main`): `update.xml` with `stable`, download points to GitHub Release asset -4. **Frozen Snapshot** (`version/XX.YY`): immutable, never force-pushed +1. **Development** (`dev` or `dev/**`): `updates.xml` with `development`, download points to Gitea release ZIP +2. **Alpha** (`alpha/**`): `updates.xml` with `alpha`, cascades to development channel +3. **Beta** (`beta/**`): `updates.xml` with `beta`, cascades to alpha + development channels +4. **Release Candidate** (`rc/**`): `updates.xml` with `rc`, cascades to beta + alpha + development channels +5. **Stable Release** (merge to `main`): `updates.xml` with `stable`, cascades to all channels, download points to GitHub Release asset +6. **Frozen Snapshot** (`version/XX`): immutable, never force-pushed ### Health Checks -- 2.52.0 From 5f963a1e127c9429ecb1869dc6ad5f879b059f82 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Thu, 23 Apr 2026 15:13:53 -0500 Subject: [PATCH 2/5] fix: remove CSS injection and lock MokoWaaS plugin on install/update - Remove injectColorScheme() and injectCustomCss() entirely - Remove all addStyleDeclaration calls (no visual injection in pages) - Lock MokoWaaS plugin (locked=1) alongside MokoOnyx on install/update Co-Authored-By: Claude Opus 4.6 (1M context) --- src/Extension/MokoWaaS.php | 125 ------------------------------------- src/script.php | 2 +- 2 files changed, 1 insertion(+), 126 deletions(-) diff --git a/src/Extension/MokoWaaS.php b/src/Extension/MokoWaaS.php index e67eb2f..1a5a9b0 100644 --- a/src/Extension/MokoWaaS.php +++ b/src/Extension/MokoWaaS.php @@ -851,8 +851,6 @@ class MokoWaaS extends CMSPlugin } $this->injectFavicon($doc); - $this->injectColorScheme($doc); - $this->injectCustomCss($doc); } /** @@ -1528,127 +1526,4 @@ class MokoWaaS extends CMSPlugin ); } - /** - * Inject CSS custom properties for the admin color scheme. - * - * @param \Joomla\CMS\Document\HtmlDocument $doc - * - * @return void - * - * @since 02.01.08 - */ - /** - * Inject admin color scheme. - * - * Atum reads colors from template style params at render time and - * outputs them as inline CSS variables. We enforce the params in - * enforceAtumBranding(). This method handles any additional CSS - * overrides needed beyond what the params support. - * - * @param \Joomla\CMS\Document\HtmlDocument $doc - * - * @return void - * - * @since 02.01.08 - */ - protected function injectColorScheme($doc) - { - $primary = $this->params->get('color_primary', ''); - $brandIcon = $this->params->get('brand_icon', ''); - $css = ''; - - // Brand button colors derived from primary color - if (!empty($primary)) - { - $primary = htmlspecialchars($primary, ENT_QUOTES, 'UTF-8'); - - $css .= '.btn-primary,' - . '.btn-primary:not(:disabled):not(.disabled){' - . 'background-color:' . $primary . ';' - . 'border-color:' . $primary . ';' - . 'color:#000;' - . 'box-shadow:0 2px 4px rgba(0,0,0,.15);}' - . '.btn-primary:hover,.btn-primary:focus{' - . 'background-color:' . $primary . ';' - . 'border-color:' . $primary . ';' - . 'color:#000;' - . 'filter:brightness(0.85);' - . 'box-shadow:0 4px 8px rgba(0,0,0,.2);}' - . '.btn-primary:active,.btn-primary.active{' - . 'background-color:' . $primary . ';' - . 'border-color:' . $primary . ';' - . 'color:#000;' - . 'filter:brightness(0.75);}' - . '.btn-outline-primary{' - . 'color:' . $primary . ';' - . 'border-color:' . $primary . ';' - . 'border-width:2px;}' - . '.btn-outline-primary:hover,.btn-outline-primary:focus{' - . 'background-color:' . $primary . ';' - . 'border-color:' . $primary . ';' - . 'color:#000;}'; - } - - // Drawer toggle button: flat edge on the sidebar-facing side - // Close button in drawer: styled to match brand - $css .= '[dir="ltr"] .main-nav-container .menu-collapse,' - . '[dir="ltr"] .sidebar-toggle{' - . 'border-top-left-radius:0!important;' - . 'border-bottom-left-radius:0!important;}' - . '[dir="rtl"] .main-nav-container .menu-collapse,' - . '[dir="rtl"] .sidebar-toggle{' - . 'border-top-right-radius:0!important;' - . 'border-bottom-right-radius:0!important;}' - . '.sidebar-wrapper .btn-close,' - . '.sidebar-wrapper [data-bs-dismiss]{' - . 'opacity:1;' - . 'filter:none;' - . 'font-size:1.1rem;}'; - - // Brand icon override (FontAwesome unicode codepoint) - if (!empty($brandIcon)) - { - $brandIcon = preg_replace('/[^a-fA-F0-9]/', '', $brandIcon); - - if (!empty($brandIcon)) - { - $css .= '.icon-joomla::before,' - . '.icon-brands.fa-joomla::before{' - . 'font-family:"Font Awesome 6 Free"!important;' - . 'content:"\\' . $brandIcon . '"!important;' - . 'font-weight:900!important;}'; - } - } - - if (!empty(trim($css))) - { - $css = str_replace('', '', $css); - $doc->addStyleDeclaration($css); - } - } - - /** - * Inject custom CSS from the plugin config textarea. - * - * @param \Joomla\CMS\Document\HtmlDocument $doc - * - * @return void - * - * @since 02.01.08 - */ - protected function injectCustomCss($doc) - { - $css = $this->params->get('custom_css', ''); - - if (empty($css)) - { - return; - } - - // Sanitize: strip to prevent injection - $css = str_replace('', '', $css); - - $doc->addStyleDeclaration($css); - } - } diff --git a/src/script.php b/src/script.php index 05cd33e..3504ba9 100644 --- a/src/script.php +++ b/src/script.php @@ -197,7 +197,7 @@ class plgSystemMokoWaaSInstallerScript implements InstallerScriptInterface $db->getQuery(true) ->update($db->quoteName('#__extensions')) ->set($db->quoteName('enabled') . ' = 1') - ->set($db->quoteName('locked') . ' = 0') + ->set($db->quoteName('locked') . ' = 1') ->set($db->quoteName('protected') . ' = 1') ->where($db->quoteName('element') . ' = ' . $db->quote('mokowaas')) -- 2.52.0 From 03d80f2be5bc7cdec627384a0ea96aa99213bef4 Mon Sep 17 00:00:00 2001 From: "gitea-actions[bot]" Date: Thu, 23 Apr 2026 20:14:31 +0000 Subject: [PATCH 3/5] chore(version): auto-bump patch 02.01.21 [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e25489a..98d2e83 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ DEFGROUP: Joomla.Plugin INGROUP: MokoWaaS REPO: https://github.com/mokoconsulting-tech/mokowaas - VERSION: 02.01.20 + VERSION: 02.01.21 PATH: /README.md BRIEF: Rebranding plugin for MokoWaaS platform NOTE: Internal WaaS identity abstraction layer -- 2.52.0 From 43cdc5e5073dfc0771552c3c70db5c1efd4cbd0b Mon Sep 17 00:00:00 2001 From: "gitea-actions[bot]" Date: Thu, 23 Apr 2026 20:14:32 +0000 Subject: [PATCH 4/5] chore: update updates.xml (development: 02.01.21-dev) [skip ci] --- updates.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/updates.xml b/updates.xml index ab97bcd..adf137a 100644 --- a/updates.xml +++ b/updates.xml @@ -11,7 +11,7 @@ System - MokoWaaS (development) mokowaas plugin - 02.01.20-dev + 02.01.21-dev site system @@ -19,9 +19,9 @@ https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS - https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/development/mokowaas-02.01.20-dev.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/development/mokowaas-02.01.21-dev.zip - edb7ccb285d9d5889a559c55b85e2555006c0b41040ddf0f8a4dd34f1ca0f14b + a395d1c0691302a4a15f02decdc57e06a4168f3d7334c6f184996fc50beabebc Moko Consulting https://mokoconsulting.tech -- 2.52.0 From 5a85d2e65874e70765a9468814aacad6131e9390 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Thu, 23 Apr 2026 17:40:48 -0500 Subject: [PATCH 5/5] fix: remove already_released skip gate from auto-release The check was blocking all patch releases because the stable tag and version/XX branch persist across patches. Now always runs. Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/auto-release.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml index eefafbf..44b3a5a 100644 --- a/.github/workflows/auto-release.yml +++ b/.github/workflows/auto-release.yml @@ -133,11 +133,8 @@ jobs: echo "tag_exists=$TAG_EXISTS" >> "$GITHUB_OUTPUT" echo "branch_exists=$BRANCH_EXISTS" >> "$GITHUB_OUTPUT" - if [ "$TAG_EXISTS" = "true" ] && [ "$BRANCH_EXISTS" = "true" ]; then - echo "already_released=true" >> "$GITHUB_OUTPUT" - else - echo "already_released=false" >> "$GITHUB_OUTPUT" - fi + # Tag and branch may persist across patch releases — never skip + echo "already_released=false" >> "$GITHUB_OUTPUT" # -- SANITY CHECKS ------------------------------------------------------- - name: "Sanity: Pre-release validation" -- 2.52.0