Public Access
86ccfdc64f
- Document new 10-workflow standard for Joomla, 11 for Dolibarr - Remove deploy.yml from definitions (deploy is manual only) - Add pre-release.yml to definitions - Update waas-component.tf: ci-dolibarr + publish-to-mokodolimods - Canonical source is now template repos, not API repo Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
500 lines
18 KiB
Terraform
500 lines
18 KiB
Terraform
/**
|
|
* MokoWaaS Joomla Template Structure Definition
|
|
* Standard repository structure for Joomla template projects
|
|
*
|
|
* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
* Version: 04.06.10
|
|
* Schema Version: 1.0
|
|
*/
|
|
|
|
locals {
|
|
repository_structure = {
|
|
metadata = {
|
|
name = "Joomla Template"
|
|
description = "Standard repository structure for Joomla templates (site or administrator)"
|
|
repository_type = "joomla-template"
|
|
platform = "mokowaas"
|
|
last_updated = "2026-04-14T00:00:00Z"
|
|
maintainer = "Moko Consulting"
|
|
version = "04.06.10"
|
|
schema_version = "1.0"
|
|
}
|
|
|
|
root_files = [
|
|
{
|
|
name = "README.md"
|
|
extension = "md"
|
|
description = "Developer-focused documentation for contributors and maintainers"
|
|
required = true
|
|
always_overwrite = false
|
|
protected = true
|
|
audience = "developer"
|
|
},
|
|
{
|
|
name = "LICENSE"
|
|
extension = ""
|
|
description = "License file (GPL-3.0-or-later) - Default for Joomla templates"
|
|
required = true
|
|
audience = "general"
|
|
template = "templates/licenses/GPL-3.0"
|
|
license_type = "GPL-3.0-or-later"
|
|
},
|
|
{
|
|
name = "CHANGELOG.md"
|
|
extension = "md"
|
|
description = "Version history and changes"
|
|
required = true
|
|
audience = "general"
|
|
},
|
|
{
|
|
name = "SECURITY.md"
|
|
extension = "md"
|
|
description = "Security policy and vulnerability reporting"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "templates/docs/required/template-SECURITY.md"
|
|
audience = "general"
|
|
},
|
|
{
|
|
name = "CODE_OF_CONDUCT.md"
|
|
extension = "md"
|
|
description = "Community code of conduct"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "templates/docs/extra/template-CODE_OF_CONDUCT.md"
|
|
audience = "contributor"
|
|
},
|
|
{
|
|
name = "CONTRIBUTING.md"
|
|
extension = "md"
|
|
description = "Contribution guidelines"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "templates/docs/required/template-CONTRIBUTING.md"
|
|
audience = "contributor"
|
|
},
|
|
{
|
|
name = "templateDetails.xml"
|
|
extension = "xml"
|
|
description = "Joomla template manifest — declares template metadata, positions, styles, and dependencies"
|
|
required = true
|
|
always_overwrite = false
|
|
audience = "developer"
|
|
stub_content = <<-MOKO_END
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
<extension type="template" client="site" method="upgrade">
|
|
<name>{{TEMPLATE_NAME}}</name>
|
|
<creationDate>{{CREATION_DATE}}</creationDate>
|
|
<author>Moko Consulting</author>
|
|
<authorEmail>hello@mokoconsulting.tech</authorEmail>
|
|
<authorUrl>https://mokoconsulting.tech</authorUrl>
|
|
<copyright>Copyright (C) 2026 Moko Consulting. All rights reserved.</copyright>
|
|
<license>GPL-3.0-or-later</license>
|
|
<version>{{VERSION}}</version>
|
|
<description>{{REPO_DESCRIPTION}}</description>
|
|
|
|
<files>
|
|
<filename>index.php</filename>
|
|
<filename>component.php</filename>
|
|
<filename>error.php</filename>
|
|
<filename>offline.php</filename>
|
|
<filename>templateDetails.xml</filename>
|
|
<folder>html</folder>
|
|
<folder>css</folder>
|
|
<folder>js</folder>
|
|
<folder>images</folder>
|
|
<folder>language</folder>
|
|
</files>
|
|
|
|
<media destination="templates/site/{{TEMPLATE_SHORT_NAME}}" folder="media">
|
|
<folder>css</folder>
|
|
<folder>js</folder>
|
|
<folder>images</folder>
|
|
<folder>scss</folder>
|
|
</media>
|
|
|
|
<positions>
|
|
<position>topbar</position>
|
|
<position>navbar</position>
|
|
<position>hero</position>
|
|
<position>breadcrumbs</position>
|
|
<position>sidebar-left</position>
|
|
<position>sidebar-right</position>
|
|
<position>main-top</position>
|
|
<position>main-bottom</position>
|
|
<position>footer</position>
|
|
<position>debug</position>
|
|
</positions>
|
|
|
|
<updateservers>
|
|
<server type="extension" priority="1" name="{{TEMPLATE_NAME}} Update Server">
|
|
https://git.mokoconsulting.tech/MokoConsulting/{{REPO_NAME}}/raw/branch/main/updates.xml
|
|
</server>
|
|
<server type="extension" priority="2" name="{{TEMPLATE_NAME}} Update Server">
|
|
https://git.mokoconsulting.tech/MokoConsulting/{{REPO_NAME}}/main/updates.xml
|
|
</server>
|
|
</updateservers>
|
|
|
|
<config>
|
|
<fields name="params">
|
|
<fieldset name="basic">
|
|
<field name="logoFile" type="media" label="Logo" />
|
|
<field name="siteTitle" type="text" label="Site Title" default="" />
|
|
<field name="siteDescription" type="text" label="Site Description" default="" />
|
|
<field name="colorScheme" type="list" label="Color Scheme" default="light">
|
|
<option value="light">Light</option>
|
|
<option value="dark">Dark</option>
|
|
<option value="auto">Auto (system preference)</option>
|
|
</field>
|
|
</fieldset>
|
|
<fieldset name="advanced">
|
|
<field name="fluidContainer" type="radio" label="Fluid Container" default="0">
|
|
<option value="0">No</option>
|
|
<option value="1">Yes</option>
|
|
</field>
|
|
</fieldset>
|
|
</fields>
|
|
</config>
|
|
</extension>
|
|
MOKO_END
|
|
},
|
|
{
|
|
name = "updates.xml"
|
|
extension = "xml"
|
|
description = "Joomla template update server manifest — polled by Joomla for new versions (dual-platform: Gitea priority 1, GitHub priority 2)"
|
|
required = true
|
|
always_overwrite = false
|
|
audience = "developer"
|
|
stub_content = <<-MOKO_END
|
|
<updates>
|
|
<update>
|
|
<name>{{TEMPLATE_NAME}}</name>
|
|
<description>{{REPO_DESCRIPTION}}</description>
|
|
<element>tpl_{{TEMPLATE_SHORT_NAME}}</element>
|
|
<type>template</type>
|
|
<version>{{VERSION}}</version>
|
|
<downloads>
|
|
<downloadurl type="full" format="zip">
|
|
https://git.mokoconsulting.tech/mokoconsulting-tech/{{REPO_NAME}}/releases/download/v{{VERSION}}/{{TEMPLATE_SHORT_NAME}}.zip
|
|
</downloadurl>
|
|
<downloadurl type="full" format="zip">
|
|
https://git.mokoconsulting.tech/MokoConsulting/{{REPO_NAME}}/releases/download/v{{VERSION}}/{{TEMPLATE_SHORT_NAME}}.zip
|
|
</downloadurl>
|
|
</downloads>
|
|
<targetplatform name="joomla" version="[56].*"/>
|
|
<php_minimum>8.1</php_minimum>
|
|
</update>
|
|
</updates>
|
|
MOKO_END
|
|
},
|
|
{
|
|
name = "phpstan.neon"
|
|
extension = "neon"
|
|
description = "PHPStan static analysis config with Joomla framework class stubs"
|
|
required = true
|
|
always_overwrite = true
|
|
audience = "developer"
|
|
template = "templates/configs/phpstan.joomla.neon"
|
|
},
|
|
{
|
|
name = "Makefile"
|
|
description = "Build automation for Joomla template packaging"
|
|
required = true
|
|
always_overwrite = true
|
|
audience = "developer"
|
|
template = "templates/makefiles/Makefile.joomla.template"
|
|
},
|
|
{
|
|
name = ".gitignore"
|
|
extension = "gitignore"
|
|
description = "Git ignore patterns for Joomla template development"
|
|
required = true
|
|
always_overwrite = false
|
|
audience = "developer"
|
|
template = "templates/configs/.gitignore.joomla"
|
|
},
|
|
{
|
|
name = ".editorconfig"
|
|
extension = "editorconfig"
|
|
description = "Editor configuration for consistent coding style"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "templates/configs/.editorconfig"
|
|
audience = "developer"
|
|
},
|
|
{
|
|
name = ".ftpignore"
|
|
extension = "ftpignore"
|
|
description = "FTP/SFTP ignore patterns for deploy-joomla.php"
|
|
required = false
|
|
always_overwrite = false
|
|
audience = "developer"
|
|
},
|
|
]
|
|
|
|
subdirectories = [
|
|
{
|
|
name = "src"
|
|
description = "Template source files — maps to templates/{name}/ on the Joomla server"
|
|
required = true
|
|
files = [
|
|
{
|
|
name = "index.php"
|
|
description = "Main template entry point"
|
|
required = true
|
|
always_overwrite = false
|
|
stub_content = <<-MOKO_END
|
|
<?php
|
|
/**
|
|
* @package Joomla.Site
|
|
* @subpackage Templates.{{TEMPLATE_SHORT_NAME}}
|
|
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
|
|
* @license GPL-3.0-or-later
|
|
*/
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
use Joomla\CMS\Document\HtmlDocument;
|
|
use Joomla\CMS\Factory;
|
|
use Joomla\CMS\HTML\HTMLHelper;
|
|
|
|
/** @var HtmlDocument $this */
|
|
|
|
$app = Factory::getApplication();
|
|
$wa = $this->getWebAssetManager();
|
|
$doc = $app->getDocument();
|
|
$lang = $app->getLanguage();
|
|
|
|
// Load template CSS/JS via Web Asset Manager
|
|
$wa->useStyle('template.{{TEMPLATE_SHORT_NAME}}.css');
|
|
$wa->useScript('template.{{TEMPLATE_SHORT_NAME}}.js');
|
|
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
|
|
<head>
|
|
<jdoc:include type="metas" />
|
|
<jdoc:include type="styles" />
|
|
<jdoc:include type="scripts" />
|
|
</head>
|
|
<body class="site <?php echo $this->direction === 'rtl' ? 'rtl' : 'ltr'; ?>">
|
|
<header>
|
|
<jdoc:include type="modules" name="topbar" style="none" />
|
|
<jdoc:include type="modules" name="navbar" style="none" />
|
|
</header>
|
|
|
|
<jdoc:include type="modules" name="hero" style="none" />
|
|
<jdoc:include type="modules" name="breadcrumbs" style="none" />
|
|
|
|
<main>
|
|
<jdoc:include type="modules" name="main-top" style="html5" />
|
|
<jdoc:include type="message" />
|
|
<jdoc:include type="component" />
|
|
<jdoc:include type="modules" name="main-bottom" style="html5" />
|
|
</main>
|
|
|
|
<footer>
|
|
<jdoc:include type="modules" name="footer" style="none" />
|
|
</footer>
|
|
|
|
<jdoc:include type="modules" name="debug" style="none" />
|
|
</body>
|
|
</html>
|
|
MOKO_END
|
|
},
|
|
{
|
|
name = "error.php"
|
|
description = "Error page template (404, 500, etc.)"
|
|
required = true
|
|
always_overwrite = false
|
|
},
|
|
{
|
|
name = "offline.php"
|
|
description = "Offline page template shown when site is in maintenance mode"
|
|
required = true
|
|
always_overwrite = false
|
|
},
|
|
{
|
|
name = "component.php"
|
|
description = "Component-only template (print view / raw output)"
|
|
required = false
|
|
always_overwrite = false
|
|
},
|
|
]
|
|
},
|
|
{
|
|
name = "src/html"
|
|
description = "Template overrides for Joomla component/module views"
|
|
required = true
|
|
files = [
|
|
{
|
|
name = "index.html"
|
|
description = "Prevents directory listing"
|
|
required = true
|
|
always_overwrite = true
|
|
stub_content = "<!DOCTYPE html><title></title>"
|
|
},
|
|
]
|
|
},
|
|
{
|
|
name = "src/css"
|
|
description = "Compiled CSS files"
|
|
required = true
|
|
files = []
|
|
},
|
|
{
|
|
name = "src/js"
|
|
description = "JavaScript files"
|
|
required = true
|
|
files = []
|
|
},
|
|
{
|
|
name = "src/images"
|
|
description = "Template images and icons"
|
|
required = true
|
|
files = [
|
|
{
|
|
name = "template_preview.png"
|
|
description = "Template preview screenshot shown in Joomla admin"
|
|
required = false
|
|
always_overwrite = false
|
|
},
|
|
{
|
|
name = "template_thumbnail.png"
|
|
description = "Template thumbnail shown in template list"
|
|
required = false
|
|
always_overwrite = false
|
|
},
|
|
]
|
|
},
|
|
{
|
|
name = "src/language/en-GB"
|
|
description = "English language files for the template"
|
|
required = true
|
|
files = [
|
|
{
|
|
name = "tpl_{{TEMPLATE_SHORT_NAME}}.ini"
|
|
description = "Main language strings"
|
|
required = true
|
|
always_overwrite = false
|
|
},
|
|
{
|
|
name = "tpl_{{TEMPLATE_SHORT_NAME}}.sys.ini"
|
|
description = "System language strings (used in admin template manager)"
|
|
required = true
|
|
always_overwrite = false
|
|
},
|
|
]
|
|
},
|
|
{
|
|
name = "media"
|
|
description = "Template media files — maps to media/templates/site/{name}/ on the Joomla server"
|
|
required = true
|
|
files = []
|
|
},
|
|
{
|
|
name = "media/css"
|
|
description = "Compiled CSS assets served from /media/"
|
|
required = true
|
|
files = []
|
|
},
|
|
{
|
|
name = "media/js"
|
|
description = "JavaScript assets served from /media/"
|
|
required = true
|
|
files = []
|
|
},
|
|
{
|
|
name = "media/images"
|
|
description = "Image assets served from /media/"
|
|
required = true
|
|
files = []
|
|
},
|
|
{
|
|
name = "media/scss"
|
|
description = "SCSS source files (compiled to media/css/)"
|
|
required = false
|
|
files = []
|
|
},
|
|
{
|
|
name = ".gitea/workflows"
|
|
description = "Gitea Actions CI/CD workflows"
|
|
required = true
|
|
files = [
|
|
{
|
|
name = "auto-release.yml"
|
|
description = "Automated release — builds zip, creates Gitea release, updates SHA in updates.xml. Triggered by push to main (stable) or pre-release tags (development, alpha, beta, rc)"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "workflows/auto-release.yml"
|
|
},
|
|
{
|
|
name = "ci-joomla.yml"
|
|
description = "Continuous integration — PHP linting, PHPStan static analysis, coding standards checks"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "workflows/ci-joomla.yml"
|
|
},
|
|
{
|
|
name = "pre-release.yml"
|
|
description = "Manual pre-release — builds dev/alpha/beta/rc packages with patch version bump"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "workflows/pre-release.yml"
|
|
},
|
|
{
|
|
name = "deploy-manual.yml"
|
|
description = "Manual deployment — allows selecting target environment and branch for on-demand deploys"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "workflows/deploy-manual.yml"
|
|
},
|
|
{
|
|
name = "repo-health.yml"
|
|
description = "Repository health checks — validates required files, structure compliance, and standards alignment"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "workflows/repo-health.yml"
|
|
},
|
|
{
|
|
name = "update-server.yml"
|
|
description = "Update server maintenance — validates updates.xml format and ensures download URLs are reachable"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "workflows/update-server.yml"
|
|
},
|
|
{
|
|
name = "pr-check.yml"
|
|
description = "PR gate — validates PHP syntax, manifest XML, and package build before merge to main"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "workflows/pr-check.yml"
|
|
},
|
|
{
|
|
name = "security-audit.yml"
|
|
description = "Dependency vulnerability scanning — weekly schedule and on PR when lock files change"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "workflows/security-audit.yml"
|
|
},
|
|
{
|
|
name = "notify.yml"
|
|
description = "Push notifications via ntfy on release success or workflow failure"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "workflows/notify.yml"
|
|
},
|
|
{
|
|
name = "cleanup.yml"
|
|
description = "Scheduled cleanup — delete merged branches and old workflow runs weekly"
|
|
required = true
|
|
always_overwrite = true
|
|
template = "workflows/cleanup.yml"
|
|
},
|
|
]
|
|
},
|
|
]
|
|
}
|
|
}
|