feat: add client-site definition

Defines standard structure for client Joomla site repos:
- No updates.xml (not an installable extension)
- No update-server workflow
- Has sync-media.yml for bidirectional SFTP media sync
- 10 workflows (vs 10+update-server for extensions)
- Required per-repo variables/secrets for media sync

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jonathan Miller
2026-05-04 14:04:55 -05:00
parent 3740c553da
commit fe38765d03
+223
View File
@@ -0,0 +1,223 @@
/**
* Client Joomla Site Structure Definition
* Standard repository structure for client Joomla site projects
*
* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
* SPDX-License-Identifier: GPL-3.0-or-later
* Version: 01.00.00
* Schema Version: 1.0
*/
locals {
repository_structure = {
metadata = {
name = "Client Joomla Site"
description = "Standard repository structure for client Joomla site projects (overrides, media, configuration)"
repository_type = "client-site"
platform = "mokowaas"
last_updated = "2026-05-04T00:00:00Z"
maintainer = "Moko Consulting"
version = "01.00.00"
schema_version = "1.0"
template_repo = "MokoConsulting/MokoStandards-Template-Client"
}
root_files = [
{
name = "README.md"
description = "Client project documentation"
required = true
always_overwrite = false
},
{
name = "LICENSE"
description = "License file (GPL-3.0-or-later)"
required = true
},
{
name = "CHANGELOG.md"
description = "Version history and changes"
required = true
},
{
name = "SECURITY.md"
description = "Security policy and vulnerability reporting"
required = true
always_overwrite = true
},
{
name = "CODE_OF_CONDUCT.md"
description = "Community code of conduct"
required = true
always_overwrite = true
},
{
name = "CONTRIBUTING.md"
description = "Contribution guidelines"
required = true
always_overwrite = true
},
{
name = "Makefile"
description = "Build automation"
required = true
always_overwrite = true
},
{
name = "composer.json"
description = "PHP dependency management"
required = true
always_overwrite = false
},
{
name = "phpstan.neon"
description = "PHPStan static analysis config"
required = true
always_overwrite = true
},
{
name = "codeception.yml"
description = "Codeception test framework config"
required = false
always_overwrite = false
},
{
name = ".editorconfig"
description = "Editor configuration for consistent coding style"
required = true
always_overwrite = true
},
{
name = ".gitignore"
description = "Git ignore patterns for client site projects"
required = true
always_overwrite = false
},
]
// NOTE: Client sites do NOT have updates.xml — they are not installable extensions
subdirectories = [
{
name = "src"
description = "Site source files — template overrides, custom code, and configuration"
required = true
files = []
},
{
name = "src/images"
description = "Site images — branding, headers, event photos, profiles"
required = true
files = []
},
{
name = "src/media"
description = "Media assets — uploaded files, documents"
required = true
files = []
},
{
name = "docs"
description = "Client-specific documentation — brand reference, deployment, migration plans"
required = true
files = []
},
{
name = "scripts"
description = "Deployment and maintenance scripts"
required = false
files = []
},
{
name = "tests"
description = "Acceptance and unit tests"
required = false
files = []
},
{
name = ".gitea/workflows"
description = "Gitea Actions CI/CD workflows (10 workflows — no update-server)"
required = true
files = [
{
name = "auto-release.yml"
description = "Stable release on PR merge to main"
required = true
always_overwrite = true
},
{
name = "pre-release.yml"
description = "Manual pre-release for dev/alpha/beta/rc channels"
required = true
always_overwrite = true
},
{
name = "ci-joomla.yml"
description = "PHP lint, PHPStan, coding standards"
required = true
always_overwrite = true
},
{
name = "pr-check.yml"
description = "PR gate — validates code quality before merge"
required = true
always_overwrite = true
},
{
name = "deploy-manual.yml"
description = "Manual SFTP deploy to selected environment"
required = true
always_overwrite = true
},
{
name = "repo-health.yml"
description = "Repository health checks"
required = true
always_overwrite = true
},
{
name = "security-audit.yml"
description = "Dependency vulnerability scanning"
required = true
always_overwrite = true
},
{
name = "notify.yml"
description = "ntfy push notifications on release success or failure"
required = true
always_overwrite = true
},
{
name = "cleanup.yml"
description = "Weekly merged branch + old run cleanup"
required = true
always_overwrite = true
},
{
name = "sync-media.yml"
description = "Bidirectional SFTP sync for images/, files/, media/ between dev and production"
required = true
always_overwrite = true
},
]
},
]
// Per-repo variables required for sync-media.yml
required_variables = [
{ name = "DEV_SYNC_HOST", description = "Dev server hostname" },
{ name = "DEV_SYNC_PORT", description = "Dev SSH port (default 22)" },
{ name = "DEV_SYNC_USERNAME", description = "Dev server username" },
{ name = "DEV_SYNC_PATH", description = "Base path on dev server" },
{ name = "PROD_SYNC_HOST", description = "Production server hostname" },
{ name = "PROD_SYNC_PORT", description = "Production SSH port (default 22)" },
{ name = "PROD_SYNC_USERNAME", description = "Production server username" },
{ name = "PROD_SYNC_PATH", description = "Base path on production server" },
]
required_secrets = [
{ name = "DEV_SYNC_KEY", description = "SSH private key for dev server" },
{ name = "PROD_SYNC_KEY", description = "SSH private key for production server" },
]
}
}