diff --git a/definitions/default/client-site.tf b/definitions/default/client-site.tf new file mode 100644 index 0000000..5f29420 --- /dev/null +++ b/definitions/default/client-site.tf @@ -0,0 +1,223 @@ +/** + * Client Joomla Site Structure Definition + * Standard repository structure for client Joomla site projects + * + * Copyright (C) 2026 Moko Consulting + * 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" }, + ] + } +}