Files
MokoCLI/definitions/default/joomla-template.tf
T
Jonathan Miller 86ccfdc64f docs: add WORKFLOW_STANDARDS.md + update definitions
- 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>
2026-05-02 17:15:07 -05:00

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"
},
]
},
]
}
}