diff --git a/.mokogit/GEMINI.md b/.mokogit/GEMINI.md new file mode 100644 index 0000000..ef4e8d9 --- /dev/null +++ b/.mokogit/GEMINI.md @@ -0,0 +1,51 @@ +# {{REPO_NAME}} + +{{REPO_DESCRIPTION}} + +> AI-client instructions for **Gemini**. Mirrors `.mokogit/CLAUDE.md` — keep CLAUDE.md, GEMINI.md, and MOKOAI.md in sync. + +## First-Run Setup + +> Before starting any work, complete these steps: +> +> 1. Replace all `{{REPO_NAME}}` placeholders with the actual repository name +> 2. Replace `{{REPO_DESCRIPTION}}` with a one-line project description +> 3. Replace `{{PLATFORM_TYPE}}` with the project type (e.g. `generic`, `npm`, `joomla`) +> 4. Replace `{{PRIMARY_LANGUAGE}}` with the dominant language +> 5. Set repository metadata via the MokoGIT **Metadata** field — repository **Settings → Metadata**, or the REST API `PUT /api/v1/repos/{owner}/{repo}/manifest` (identity, platform, language, package-type, entry-point). There is no metadata file in the repo. +> 6. Update the **Architecture** section for your project +> 7. Update the Commands section with actual build commands +> 8. Delete this setup block after completing all steps +> 9. Commit: `chore: initialize {{REPO_NAME}}` + +## Quick Reference + +| Field | Value | +|---|---| +| **Platform** | {{PLATFORM_TYPE}} | +| **Language** | {{PRIMARY_LANGUAGE}} | +| **Branch** | develop on `dev`, merge to `main` (protected) | +| **Wiki** | [Wiki](https://git.mokoconsulting.tech/MokoConsulting/{{REPO_NAME}}/wiki) | + +## Commands + +```bash +make build # Build the project +make lint # Run linters +make validate # Validate structure +make release # Full release pipeline +make clean # Clean build artifacts +``` + +## Architecture + + + +## Rules + +- **Never commit** `.gemini/`, `.mcp.json`, `TODO.md`, `*.min.css`/`*.min.js` +- **Attribution**: `Authored-by: Moko Consulting` +- **Workflow directory**: `.mokogit/` (not `.gitea/` or `.github/`) +- **Metadata**: set via the MokoGIT **Metadata** field (API / Settings → Metadata), never a committed manifest file +- **Wiki**: documentation lives in the MokoGIT wiki, not `docs/` files +- **Standards**: [MokoCLI](https://git.mokoconsulting.tech/MokoConsulting/mokocli/wiki/Home) diff --git a/.mokogit/ISSUE_TEMPLATE/adr.md b/.mokogit/ISSUE_TEMPLATE/adr.md new file mode 100644 index 0000000..eb40760 --- /dev/null +++ b/.mokogit/ISSUE_TEMPLATE/adr.md @@ -0,0 +1,110 @@ +--- +name: Architecture Decision Record (ADR) +about: Propose or document an architectural decision +title: '[ADR] ' +labels: 'architecture, decision' +assignees: '' + +--- + + +## ADR Number +ADR-XXXX + +## Status +- [ ] Proposed +- [ ] Accepted +- [ ] Deprecated +- [ ] Superseded by ADR-XXXX + +## Context +Describe the issue or problem that motivates this decision. + +## Decision +State the architecture decision and provide rationale. + +## Consequences +### Positive +- List positive consequences + +### Negative +- List negative consequences or trade-offs + +### Neutral +- List neutral aspects + +## Alternatives Considered +### Alternative 1 +- Description +- Pros +- Cons +- Why not chosen + +### Alternative 2 +- Description +- Pros +- Cons +- Why not chosen + +## Implementation Plan +1. Step 1 +2. Step 2 +3. Step 3 + +## Stakeholders +- **Decision Makers**: @user1, @user2 +- **Consulted**: @user3, @user4 +- **Informed**: team-name + +## Technical Details +### Architecture Diagram +``` +[Add diagram or link] +``` + +### Dependencies +- Dependency 1 +- Dependency 2 + +### Impact Analysis +- **Performance**: [Impact description] +- **Security**: [Impact description] +- **Scalability**: [Impact description] +- **Maintainability**: [Impact description] + +## Testing Strategy +- [ ] Unit tests +- [ ] Integration tests +- [ ] Performance tests +- [ ] Security tests + +## Documentation +- [ ] Architecture documentation updated +- [ ] API documentation updated +- [ ] Developer guide updated +- [ ] Runbook created + +## Migration Path +Describe how to migrate from current state to new architecture. + +## Rollback Plan +Describe how to rollback if issues occur. + +## Timeline +- **Proposal Date**: +- **Decision Date**: +- **Implementation Start**: +- **Expected Completion**: + +## References +- Related ADRs: +- External resources: +- RFCs: + +## Review Checklist +- [ ] Aligns with enterprise architecture principles +- [ ] Security implications reviewed +- [ ] Performance implications reviewed +- [ ] Cost implications reviewed +- [ ] Compliance requirements met +- [ ] Team consensus achieved diff --git a/.mokogit/ISSUE_TEMPLATE/bug_report.md b/.mokogit/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..38a16a7 --- /dev/null +++ b/.mokogit/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,48 @@ +--- +name: Bug Report +about: Report a bug or issue with the project +title: '[BUG] ' +labels: 'bug' +assignees: '' + +--- + + +## Bug Description +A clear and concise description of what the bug is. + +## Steps to Reproduce +1. Go to '...' +2. Click on '...' +3. Scroll down to '...' +4. See error + +## Expected Behavior +A clear and concise description of what you expected to happen. + +## Actual Behavior +A clear and concise description of what actually happened. + +## Screenshots +If applicable, add screenshots to help explain your problem. + +## Environment +- **Project**: [e.g., MokoDoliTools, moko-cassiopeia] +- **Version**: [e.g., 1.2.3] +- **Platform**: [e.g., Dolibarr 18.0, Joomla 5.0] +- **PHP Version**: [e.g., 8.1] +- **Database**: [e.g., MySQL 8.0, PostgreSQL 14] +- **Browser** (if applicable): [e.g., Chrome 120, Firefox 121] +- **OS**: [e.g., Ubuntu 22.04, Windows 11] + +## Additional Context +Add any other context about the problem here. + +## Possible Solution +If you have suggestions on how to fix the issue, please describe them here. + +## Checklist +- [ ] I have searched for similar issues before creating this one +- [ ] I have provided all the requested information +- [ ] I have tested this on the latest stable version +- [ ] I have checked the documentation and couldn't find a solution diff --git a/.mokogit/ISSUE_TEMPLATE/config.yml b/.mokogit/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..c52380c --- /dev/null +++ b/.mokogit/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,18 @@ +--- +blank_issues_enabled: true +contact_links: + - name: 💼 Enterprise Support + url: https://mokoconsulting.tech/enterprise + about: Enterprise-level support and consultation services + - name: 💬 Ask a Question + url: https://mokoconsulting.tech/ + about: Get help or ask questions through our website + - name: 📚 MokoCLI Documentation + url: https://git.mokoconsulting.tech/MokoConsulting/mokocli + about: View our coding standards and best practices + - name: 🔒 Report a Security Vulnerability + url: https://git.mokoconsulting.tech/MokoConsulting/.github-private/security/advisories/new + about: Report security vulnerabilities privately (for critical issues) + - name: 💡 Community Discussions + url: https://github.com/orgs/mokoconsulting-tech/discussions + about: Join community discussions and Q&A diff --git a/.mokogit/ISSUE_TEMPLATE/documentation.md b/.mokogit/ISSUE_TEMPLATE/documentation.md new file mode 100644 index 0000000..8156651 --- /dev/null +++ b/.mokogit/ISSUE_TEMPLATE/documentation.md @@ -0,0 +1,52 @@ +--- +name: Documentation Issue +about: Report an issue with documentation +title: '[DOCS] ' +labels: 'documentation' +assignees: '' + +--- + + +## Documentation Issue + +**Location**: + + +## Issue Type + +- [ ] Typo or grammar error +- [ ] Outdated information +- [ ] Missing documentation +- [ ] Unclear explanation +- [ ] Broken links +- [ ] Missing examples +- [ ] Other (specify below) + +## Description + + +## Current Content + +``` +Current text here +``` + +## Suggested Improvement + +``` +Suggested text here +``` + +## Additional Context + + +## Standards Alignment +- [ ] Follows MokoCLI documentation guidelines +- [ ] Uses en_US/en_GB localization +- [ ] Includes proper SPDX headers where applicable + +## Checklist +- [ ] I have searched for similar documentation issues +- [ ] I have provided a clear description +- [ ] I have suggested an improvement (if applicable) diff --git a/.mokogit/ISSUE_TEMPLATE/feature_request.md b/.mokogit/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..650523c --- /dev/null +++ b/.mokogit/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,51 @@ +--- +name: Feature Request +about: Suggest a new feature or enhancement +title: '[FEATURE] ' +labels: 'enhancement' +assignees: '' + +--- + + +## Feature Description +A clear and concise description of the feature you'd like to see. + +## Problem or Use Case +Describe the problem this feature would solve or the use case it addresses. +Ex. I'm always frustrated when [...] + +## Proposed Solution +A clear and concise description of what you want to happen. + +## Alternative Solutions +A clear and concise description of any alternative solutions or features you've considered. + +## Benefits +Describe how this feature would benefit users: +- Who would use this feature? +- What problems does it solve? +- What value does it add? + +## Implementation Details (Optional) +If you have ideas about how this could be implemented, share them here: +- Technical approach +- Files/components that might need changes +- Any concerns or challenges you foresee + +## Additional Context +Add any other context, mockups, or screenshots about the feature request here. + +## Relevant Standards +Does this relate to any standards in [MokoCLI](https://git.mokoconsulting.tech/MokoConsulting/mokocli)? +- [ ] Accessibility (WCAG 2.1 AA) +- [ ] Localization (en_US/en_GB) +- [ ] Security best practices +- [ ] Code quality standards +- [ ] Other: [specify] + +## Checklist +- [ ] I have searched for similar feature requests before creating this one +- [ ] I have clearly described the use case and benefits +- [ ] I have considered alternative solutions +- [ ] This feature aligns with the project's goals and scope diff --git a/.mokogit/ISSUE_TEMPLATE/joomla_issue.md b/.mokogit/ISSUE_TEMPLATE/joomla_issue.md new file mode 100644 index 0000000..d808f79 --- /dev/null +++ b/.mokogit/ISSUE_TEMPLATE/joomla_issue.md @@ -0,0 +1,87 @@ +--- +name: Joomla Extension Issue +about: Report an issue with a Joomla extension +title: '[JOOMLA] ' +labels: 'joomla' +assignees: '' + +--- + + +## Issue Type +- [ ] Component Issue +- [ ] Module Issue +- [ ] Plugin Issue +- [ ] Template Issue + +## Extension Details +- **Extension Name**: [e.g., moko-cassiopeia] +- **Extension Version**: [e.g., 1.2.3] +- **Extension Type**: [Component / Module / Plugin / Template] + +## Joomla Environment +- **Joomla Version**: [e.g., 4.4.0, 5.0.0] +- **PHP Version**: [e.g., 8.1.0] +- **Database**: [MySQL / PostgreSQL / MariaDB] +- **Database Version**: [e.g., 8.0] +- **Server**: [Apache / Nginx / IIS] +- **Hosting**: [Shared / VPS / Dedicated / Cloud] + +## Issue Description +Provide a clear and detailed description of the issue. + +## Steps to Reproduce +1. Go to '...' +2. Click on '...' +3. Configure '...' +4. See error + +## Expected Behavior +What you expected to happen. + +## Actual Behavior +What actually happened. + +## Error Messages +``` +# Paste any error messages from Joomla error logs +# Location: administrator/logs/error.php +``` + +## Browser Console Errors +```javascript +// Paste any JavaScript console errors (F12 in browser) +``` + +## Screenshots +Add screenshots to help explain the issue. + +## Configuration +```ini +# Paste extension configuration (sanitize sensitive data) +``` + +## Installed Extensions +List other installed extensions that might conflict: +- Extension 1 (version) +- Extension 2 (version) + +## Template Overrides +- [ ] Using template overrides +- [ ] Custom CSS +- [ ] Custom JavaScript + +## Additional Context +- **Multilingual Site**: [Yes / No] +- **Cache Enabled**: [Yes / No] +- **Debug Mode**: [Yes / No] +- **SEF URLs**: [Yes / No] + +## Checklist +- [ ] I have cleared Joomla cache +- [ ] I have disabled other extensions to test for conflicts +- [ ] I have checked Joomla error logs +- [ ] I have tested with a default Joomla template +- [ ] I have checked browser console for JavaScript errors +- [ ] I have searched for similar issues +- [ ] I am using a supported Joomla version diff --git a/.mokogit/ISSUE_TEMPLATE/question.md b/.mokogit/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..3175013 --- /dev/null +++ b/.mokogit/ISSUE_TEMPLATE/question.md @@ -0,0 +1,82 @@ +--- +name: Question +about: Ask a question about usage, features, or best practices +title: '[QUESTION] ' +labels: ['question'] +assignees: ['jmiller'] +--- + + +## Question + +**Your question:** + + +## Context + +**What are you trying to accomplish?** + + +**What have you already tried?** + + +**Category**: +- [ ] Script usage +- [ ] Configuration +- [ ] Workflow setup +- [ ] Documentation interpretation +- [ ] Best practices +- [ ] Integration +- [ ] Other: __________ + +## Environment (if relevant) + +**Your setup**: +- Operating System: +- Version: + +## What You've Researched + +**Documentation reviewed**: +- [ ] README.md +- [ ] Project documentation +- [ ] Other (specify): __________ + +**Similar issues/questions found**: +- # +- # + +## Expected Outcome + +**What result are you hoping for?** + + +## Code/Configuration Samples + +**Relevant code or configuration** (if applicable): + +```bash +# Your code here +``` + +## Additional Context + +**Any other relevant information:** + + +**Screenshots** (if helpful): + + +## Urgency + +- [ ] Urgent (blocking work) +- [ ] Normal (can work on other things meanwhile) +- [ ] Low priority (just curious) + +## Checklist + +- [ ] I have searched existing issues and discussions +- [ ] I have reviewed relevant documentation +- [ ] I have provided sufficient context +- [ ] I have included code/configuration samples if relevant +- [ ] This is a genuine question (not a bug report or feature request) diff --git a/.mokogit/ISSUE_TEMPLATE/rfc.md b/.mokogit/ISSUE_TEMPLATE/rfc.md new file mode 100644 index 0000000..6f09af7 --- /dev/null +++ b/.mokogit/ISSUE_TEMPLATE/rfc.md @@ -0,0 +1,126 @@ +--- +name: Request for Comments (RFC) +about: Propose a significant change for community discussion +title: '[RFC] ' +labels: 'rfc, discussion' +assignees: '' + +--- + + +## RFC Summary +One-paragraph summary of the proposal. + +## Motivation +Why are we doing this? What use cases does it support? What is the expected outcome? + +## Detailed Design +### Overview +Provide a detailed explanation of the proposed change. + +### API Changes (if applicable) +```php +// Before +function oldApi($param1) { } + +// After +function newApi($param1, $param2) { } +``` + +### User Experience Changes +Describe how users will interact with this change. + +### Implementation Approach +High-level implementation strategy. + +## Drawbacks +Why should we *not* do this? + +## Alternatives +What other designs have been considered? What is the impact of not doing this? + +### Alternative 1 +- Description +- Trade-offs + +### Alternative 2 +- Description +- Trade-offs + +## Adoption Strategy +How will existing users adopt this? Is this a breaking change? + +### Migration Guide +```bash +# Steps to migrate +``` + +### Deprecation Timeline +- **Announcement**: +- **Deprecation**: +- **Removal**: + +## Unresolved Questions +- Question 1 +- Question 2 + +## Future Possibilities +What future work does this enable? + +## Impact Assessment +### Performance +Expected performance impact. + +### Security +Security considerations and implications. + +### Compatibility +- **Backward Compatible**: [Yes / No] +- **Breaking Changes**: [List] + +### Maintenance +Long-term maintenance considerations. + +## Community Input +### Stakeholders +- [ ] Core team +- [ ] Module developers +- [ ] End users +- [ ] Enterprise customers + +### Feedback Period +**Duration**: [e.g., 2 weeks] +**Deadline**: [date] + +## Implementation Timeline +### Phase 1: Design +- [ ] RFC discussion +- [ ] Design finalization +- [ ] Approval + +### Phase 2: Implementation +- [ ] Core implementation +- [ ] Tests +- [ ] Documentation + +### Phase 3: Release +- [ ] Beta release +- [ ] Feedback collection +- [ ] Stable release + +## Success Metrics +How will we measure success? +- Metric 1 +- Metric 2 + +## References +- Related RFCs: +- External documentation: +- Prior art: + +## Open Questions for Community +1. Question 1? +2. Question 2? + +--- +**Note**: This RFC is open for community discussion. Please provide feedback in the comments below. diff --git a/.mokogit/ISSUE_TEMPLATE/security.md b/.mokogit/ISSUE_TEMPLATE/security.md new file mode 100644 index 0000000..37a266d --- /dev/null +++ b/.mokogit/ISSUE_TEMPLATE/security.md @@ -0,0 +1,51 @@ +--- +name: Security Vulnerability Report +about: Report a security vulnerability (use only for non-critical issues) +title: '[SECURITY] ' +labels: 'security' +assignees: '' + +--- + + +## ⚠️ IMPORTANT: Private Disclosure Required + +**For critical security vulnerabilities, DO NOT use this template.** +Follow the process in [SECURITY.md](../SECURITY.md) for responsible disclosure. + +Use this template only for: +- Security improvements +- Non-critical security suggestions +- Security documentation updates + +--- + +## Security Issue + +**Severity**: + + +## Description + + +## Affected Components + + +## Suggested Mitigation + + +## Standards Reference +Does this relate to security standards in [MokoCLI](https://git.mokoconsulting.tech/MokoConsulting/mokocli)? +- [ ] SPDX license identifiers +- [ ] Secret management +- [ ] Dependency security +- [ ] Access control +- [ ] Other: [specify] + +## Additional Context + + +## Checklist +- [ ] This is NOT a critical vulnerability requiring private disclosure +- [ ] I have reviewed the SECURITY.md policy +- [ ] I have provided sufficient detail for evaluation diff --git a/.mokogit/ISSUE_TEMPLATE/version.md b/.mokogit/ISSUE_TEMPLATE/version.md new file mode 100644 index 0000000..6328421 --- /dev/null +++ b/.mokogit/ISSUE_TEMPLATE/version.md @@ -0,0 +1,24 @@ +--- +name: Version Bump +about: Request or track a version change +title: '[VERSION] ' +labels: 'version, type: version' +assignees: 'jmiller' +--- + +## Version Change + +**Current version**: +**Requested version**: +**Change type**: + +## Reason + + + +## Checklist + +- [ ] README.md `VERSION:` field updated +- [ ] CHANGELOG.md entry added +- [ ] Module descriptor version updated (Dolibarr: `$this->version`, Joomla: ``) +- [ ] All file headers will be auto-propagated by `sync-version-on-merge` workflow diff --git a/.mokogit/MOKOAI.md b/.mokogit/MOKOAI.md new file mode 100644 index 0000000..d81f6ca --- /dev/null +++ b/.mokogit/MOKOAI.md @@ -0,0 +1,51 @@ +# {{REPO_NAME}} + +{{REPO_DESCRIPTION}} + +> AI-client instructions for **MokoAI**. Mirrors `.mokogit/CLAUDE.md` — keep CLAUDE.md, GEMINI.md, and MOKOAI.md in sync. + +## First-Run Setup + +> Before starting any work, complete these steps: +> +> 1. Replace all `{{REPO_NAME}}` placeholders with the actual repository name +> 2. Replace `{{REPO_DESCRIPTION}}` with a one-line project description +> 3. Replace `{{PLATFORM_TYPE}}` with the project type (e.g. `generic`, `npm`, `joomla`) +> 4. Replace `{{PRIMARY_LANGUAGE}}` with the dominant language +> 5. Set repository metadata via the MokoGIT **Metadata** field — repository **Settings → Metadata**, or the REST API `PUT /api/v1/repos/{owner}/{repo}/manifest` (identity, platform, language, package-type, entry-point). There is no metadata file in the repo. +> 6. Update the **Architecture** section for your project +> 7. Update the Commands section with actual build commands +> 8. Delete this setup block after completing all steps +> 9. Commit: `chore: initialize {{REPO_NAME}}` + +## Quick Reference + +| Field | Value | +|---|---| +| **Platform** | {{PLATFORM_TYPE}} | +| **Language** | {{PRIMARY_LANGUAGE}} | +| **Branch** | develop on `dev`, merge to `main` (protected) | +| **Wiki** | [Wiki](https://git.mokoconsulting.tech/MokoConsulting/{{REPO_NAME}}/wiki) | + +## Commands + +```bash +make build # Build the project +make lint # Run linters +make validate # Validate structure +make release # Full release pipeline +make clean # Clean build artifacts +``` + +## Architecture + + + +## Rules + +- **Never commit** `.mokoai/`, `.mcp.json`, `TODO.md`, `*.min.css`/`*.min.js` +- **Attribution**: `Authored-by: Moko Consulting` +- **Workflow directory**: `.mokogit/` (not `.gitea/` or `.github/`) +- **Metadata**: set via the MokoGIT **Metadata** field (API / Settings → Metadata), never a committed manifest file +- **Wiki**: documentation lives in the MokoGIT wiki, not `docs/` files +- **Standards**: [MokoCLI](https://git.mokoconsulting.tech/MokoConsulting/mokocli/wiki/Home) diff --git a/.mokogit/branch-protection.yml b/.mokogit/branch-protection.yml new file mode 100644 index 0000000..009b9f2 --- /dev/null +++ b/.mokogit/branch-protection.yml @@ -0,0 +1,258 @@ +# Copyright (C) 2026 Moko Consulting +# SPDX-License-Identifier: GPL-3.0-or-later +# FILE INFORMATION +# DEFGROUP: MokoGIT.Workflow +# INGROUP: MokoCLI.Automation +# REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli +# PATH: /.mokogit/workflows/branch-protection.yml +# BRIEF: Apply standardised branch protection rules to all governed repositories +# +# +========================================================================+ +# | BRANCH PROTECTION SETUP | +# +========================================================================+ +# | | +# | Applies protection rules for: main, dev, rc, beta, alpha | +# | | +# | main — Require PR, block rejected reviews, no force push | +# | dev — Allow push, no force push, no delete | +# | rc — Allow push, no force push, no delete | +# | beta — Allow push, no force push, no delete | +# | alpha — Allow push, no force push, no delete | +# | | +# | jmiller has override authority on all branches. | +# | | +# +========================================================================+ + +name: Branch Protection Setup + +on: + schedule: + - cron: '0 2 * * 1' # Weekly Monday 02:00 UTC + workflow_dispatch: + inputs: + dry_run: + description: 'Preview mode (no changes)' + required: false + type: boolean + default: false + repos: + description: 'Comma-separated repo names (empty = all governed repos)' + required: false + type: string + default: '' + +env: + GIT_URL: https://git.mokoconsulting.tech + GIT_ORG: MokoConsulting + +permissions: + contents: read + +jobs: + protect: + name: Apply Branch Protection Rules + runs-on: ubuntu-latest + + steps: + - name: Determine target repos + id: repos + env: + GA_TOKEN: ${{ secrets.GA_TOKEN }} + run: | + API="${GIT_URL}/api/v1" + + # Platform/standards/infra repos to exclude + EXCLUDE="git-org-config org-profile git-private .mokogit-private mokocli MokoTesting" + EXCLUDE="$EXCLUDE Template-Client Template-Dolibarr Template-Generic Template-Joomla MokoDoliProjTemplate" + + if [ -n "${{ inputs.repos }}" ]; then + # User-specified repos + REPOS=$(echo "${{ inputs.repos }}" | tr ',' ' ') + else + # Fetch all org repos + PAGE=1 + REPOS="" + while true; do + BATCH=$(curl -sS \ + -H "Authorization: token ${GA_TOKEN}" \ + "${API}/orgs/${GIT_ORG}/repos?page=${PAGE}&limit=50" \ + | jq -r '.[].name // empty') + [ -z "$BATCH" ] && break + REPOS="$REPOS $BATCH" + PAGE=$((PAGE + 1)) + done + + # Filter out excluded repos + FILTERED="" + for REPO in $REPOS; do + SKIP=false + for EX in $EXCLUDE; do + if [ "$REPO" = "$EX" ]; then + SKIP=true + break + fi + done + if [ "$SKIP" = "false" ]; then + FILTERED="$FILTERED $REPO" + fi + done + REPOS="$FILTERED" + fi + + echo "repos=$REPOS" >> "$GITHUB_OUTPUT" + COUNT=$(echo "$REPOS" | wc -w) + echo "📋 Target repos (${COUNT}): $REPOS" + + - name: Apply protection rules + env: + GA_TOKEN: ${{ secrets.GA_TOKEN }} + DRY_RUN: ${{ inputs.dry_run || 'false' }} + run: | + API="${GIT_URL}/api/v1" + REPOS="${{ steps.repos.outputs.repos }}" + + SUCCESS=0 + FAILED=0 + SKIPPED=0 + + # ── Rule definitions ────────────────────────────────────── + # Only the CI bot (jmiller token) can push directly. + # All human contributors must use PRs. + # Force push disabled on all branches. + + RULE_MAIN='{ + "rule_name": "main", + "enable_push": true, + "enable_push_whitelist": true, + "push_whitelist_usernames": ["jmiller", "moko-deploy"], + "push_whitelist_actions_user": true, + "enable_force_push": false, + "enable_force_push_allowlist": false, + "force_push_allowlist_usernames": [], + "enable_merge_whitelist": false, + "required_approvals": 0, + "dismiss_stale_approvals": true, + "block_on_rejected_reviews": true, + "block_on_outdated_branch": false, + "priority": 1 + }' + + RULE_DEV='{ + "rule_name": "dev", + "enable_push": true, + "enable_push_whitelist": true, + "push_whitelist_usernames": ["jmiller", "moko-deploy"], + "push_whitelist_actions_user": true, + "enable_force_push": true, + "enable_force_push_allowlist": true, + "force_push_allowlist_usernames": ["jmiller", "moko-deploy"], + "force_push_allowlist_actions_user": true, + "enable_merge_whitelist": false, + "required_approvals": 0, + "block_on_rejected_reviews": false, + "priority": 2 + }' + + RULE_RC='{ + "rule_name": "rc", + "enable_push": true, + "enable_push_whitelist": true, + "push_whitelist_usernames": ["jmiller", "moko-deploy"], + "push_whitelist_actions_user": true, + "enable_force_push": true, + "enable_force_push_allowlist": true, + "force_push_allowlist_usernames": ["jmiller", "moko-deploy"], + "force_push_allowlist_actions_user": true, + "enable_merge_whitelist": false, + "required_approvals": 0, + "block_on_rejected_reviews": false, + "priority": 3 + }' + + RULE_BETA='{ + "rule_name": "beta", + "enable_push": true, + "enable_push_whitelist": true, + "push_whitelist_usernames": ["jmiller", "moko-deploy"], + "push_whitelist_actions_user": true, + "enable_force_push": false, + "enable_force_push_allowlist": false, + "force_push_allowlist_usernames": [], + "enable_merge_whitelist": false, + "required_approvals": 0, + "block_on_rejected_reviews": false, + "priority": 4 + }' + + RULE_ALPHA='{ + "rule_name": "alpha", + "enable_push": true, + "enable_push_whitelist": true, + "push_whitelist_usernames": ["jmiller", "moko-deploy"], + "push_whitelist_actions_user": true, + "enable_force_push": false, + "enable_force_push_allowlist": false, + "force_push_allowlist_usernames": [], + "enable_merge_whitelist": false, + "required_approvals": 0, + "block_on_rejected_reviews": false, + "priority": 5 + }' + + RULES=("$RULE_MAIN" "$RULE_DEV" "$RULE_RC" "$RULE_BETA" "$RULE_ALPHA") + RULE_NAMES=("main" "dev" "rc" "beta" "alpha") + + # ── Apply rules to each repo ────────────────────────────── + for REPO in $REPOS; do + echo "" + echo "═══ ${REPO} ═══" + + for i in "${!RULES[@]}"; do + RULE="${RULES[$i]}" + NAME="${RULE_NAMES[$i]}" + + if [ "$DRY_RUN" = "true" ]; then + echo " [DRY RUN] Would apply rule: ${NAME}" + SKIPPED=$((SKIPPED + 1)) + continue + fi + + # Delete existing rule if present (idempotent recreate) + ENCODED_NAME=$(echo "$NAME" | sed 's|/|%2F|g') + curl -sS -o /dev/null -w "" \ + -X DELETE \ + -H "Authorization: token ${GA_TOKEN}" \ + "${API}/repos/${GIT_ORG}/${REPO}/branch_protections/${ENCODED_NAME}" 2>/dev/null || true + + # Create rule + RESPONSE=$(curl -sS -w "\n%{http_code}" \ + -X POST \ + -H "Authorization: token ${GA_TOKEN}" \ + -H "Content-Type: application/json" \ + -d "$RULE" \ + "${API}/repos/${GIT_ORG}/${REPO}/branch_protections") + + HTTP=$(echo "$RESPONSE" | tail -1) + BODY=$(echo "$RESPONSE" | sed '$d') + + if [ "$HTTP" = "201" ]; then + echo " ✅ ${NAME}" + SUCCESS=$((SUCCESS + 1)) + else + echo " ❌ ${NAME} (HTTP ${HTTP}): $(echo "$BODY" | jq -r '.message // .' 2>/dev/null | head -1)" + FAILED=$((FAILED + 1)) + fi + done + done + + # ── Summary ─────────────────────────────────────────────── + echo "" + echo "════════════════════════════════════════" + echo " ✅ Success: ${SUCCESS}" + echo " ❌ Failed: ${FAILED}" + echo " ⏭️ Skipped: ${SKIPPED}" + echo "════════════════════════════════════════" + + if [ "$FAILED" -gt 0 ]; then + echo "::warning::${FAILED} rule(s) failed to apply" + fi diff --git a/.mokogit/workflows/auto-bump.yml b/.mokogit/workflows/auto-bump.yml index 8c40ed9..fba253e 100644 --- a/.mokogit/workflows/auto-bump.yml +++ b/.mokogit/workflows/auto-bump.yml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow +# DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.Release # REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli # PATH: /.mokogit/workflows/auto-bump.yml diff --git a/.mokogit/workflows/auto-release.yml b/.mokogit/workflows/auto-release.yml index cf0bbd0..d6438cb 100644 --- a/.mokogit/workflows/auto-release.yml +++ b/.mokogit/workflows/auto-release.yml @@ -3,18 +3,18 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow +# DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.Release # REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli # PATH: /templates/workflows/universal/auto-release.yml.template # VERSION: 05.01.00 -# BRIEF: Universal build & release � detects platform from MokoGit repo metadata (API) +# BRIEF: Universal build & release � detects platform from MokoGIT repo metadata (API) # # +=======================================================================+ # | UNIVERSAL BUILD & RELEASE PIPELINE | # +=======================================================================+ # | | -# | Reads MokoGit repo metadata (joomla|dolibarr|generic) to branch logic. | +# | Reads MokoGIT repo metadata (joomla|dolibarr|generic) to branch logic. | # | | # | Platform-specific: | # | joomla: XML manifest, type-prefixed packages | diff --git a/.mokogit/workflows/cascade-dev.yml b/.mokogit/workflows/cascade-dev.yml index 7a179ea..6c7e26a 100644 --- a/.mokogit/workflows/cascade-dev.yml +++ b/.mokogit/workflows/cascade-dev.yml @@ -1,7 +1,7 @@ # Copyright (C) 2026 Moko Consulting # SPDX-License-Identifier: GPL-3.0-or-later # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow +# DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.Release # BRIEF: Reset dev to main after each release (cascade). Moved out of auto-release Step 11. # diff --git a/.mokogit/workflows/ci-generic.yml b/.mokogit/workflows/ci-generic.yml index 442a94f..053109a 100644 --- a/.mokogit/workflows/ci-generic.yml +++ b/.mokogit/workflows/ci-generic.yml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow +# DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.CI # REPO: https://git.mokoconsulting.tech/MokoConsulting/Template-Generic # PATH: /.mokogit/workflows/ci-generic.yml diff --git a/.mokogit/workflows/ci-issue-reporter.yml b/.mokogit/workflows/ci-issue-reporter.yml index cb1417a..ede368d 100644 --- a/.mokogit/workflows/ci-issue-reporter.yml +++ b/.mokogit/workflows/ci-issue-reporter.yml @@ -3,12 +3,12 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow +# DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.Universal # REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli # PATH: /.mokogit/workflows/ci-issue-reporter.yml # VERSION: 01.00.00 -# BRIEF: Reusable workflow — creates/updates a MokoGit issue when a CI gate fails. +# BRIEF: Reusable workflow — creates/updates a MokoGIT issue when a CI gate fails. # Clones MokoCLI and runs cli/ci_issue_reporter.sh. name: "Universal: CI Issue Reporter" diff --git a/.mokogit/workflows/ci-joomla.yml b/.mokogit/workflows/ci-joomla.yml index 5e0077a..f9a25d9 100644 --- a/.mokogit/workflows/ci-joomla.yml +++ b/.mokogit/workflows/ci-joomla.yml @@ -5,7 +5,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow.Template +# DEFGROUP: MokoGIT.Workflow.Template # INGROUP: MokoCLI.CI # REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli # PATH: /templates/workflows/joomla/ci-joomla.yml.template @@ -186,7 +186,7 @@ jobs: else EXT_TYPE=$(grep -oP ']*\btype="\K[^"]+' "$MANIFEST" | head -1) - # 1. Check exists and uses MokoGit update server + # 1. Check exists and uses MokoGIT update server if ! grep -q '' "$MANIFEST" 2>/dev/null; then echo "::warning file=${MANIFEST}::Missing \`\` tag — extension will not receive OTA updates" echo "- **Missing** \`\` — extension will not receive OTA updates" >> $GITHUB_STEP_SUMMARY @@ -198,12 +198,12 @@ jobs: echo "- **Empty** \`\` — no server URL defined" >> $GITHUB_STEP_SUMMARY WARNINGS=$((WARNINGS + 1)) elif ! echo "$SERVER_URL" | grep -q 'git\.mokoconsulting\.tech'; then - echo "::warning file=${MANIFEST}::Update server does not use MokoGit engine: ${SERVER_URL}" - echo "- **Non-MokoGit update server:** \`${SERVER_URL}\`" >> $GITHUB_STEP_SUMMARY + echo "::warning file=${MANIFEST}::Update server does not use MokoGIT engine: ${SERVER_URL}" + echo "- **Non-MokoGIT update server:** \`${SERVER_URL}\`" >> $GITHUB_STEP_SUMMARY echo " Expected: \`https://git.mokoconsulting.tech/{org}/{repo}/updates.xml\`" >> $GITHUB_STEP_SUMMARY WARNINGS=$((WARNINGS + 1)) else - echo "- \`\`: MokoGit engine ✓" >> $GITHUB_STEP_SUMMARY + echo "- \`\`: MokoGIT engine ✓" >> $GITHUB_STEP_SUMMARY fi fi diff --git a/.mokogit/workflows/cleanup.yml b/.mokogit/workflows/cleanup.yml index ae9cc01..9c13931 100644 --- a/.mokogit/workflows/cleanup.yml +++ b/.mokogit/workflows/cleanup.yml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow +# DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.Maintenance # REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli # PATH: /.mokogit/workflows/cleanup.yml diff --git a/.mokogit/workflows/custom/workflow-sync-trigger.yml b/.mokogit/workflows/custom/workflow-sync-trigger.yml new file mode 100644 index 0000000..4739512 --- /dev/null +++ b/.mokogit/workflows/custom/workflow-sync-trigger.yml @@ -0,0 +1,83 @@ +# Copyright (C) 2026 Moko Consulting +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +# FILE INFORMATION +# DEFGROUP: MokoGIT.Workflow +# INGROUP: MokoCLI.Universal +# REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli +# PATH: /.mokogit/workflows/workflow-sync-trigger.yml +# VERSION: 01.01.00 +# BRIEF: Trigger workflow sync to live repos when a PR is merged to main + +name: "Universal: Workflow Sync Trigger" + +on: + workflow_dispatch: + pull_request: + types: [closed] + branches: + - main + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + +jobs: + sync: + name: Sync workflows to live repos + runs-on: ubuntu-latest + if: >- + startsWith(github.event.repository.name, 'Template-') && + (github.event_name == 'workflow_dispatch' || + (github.event.pull_request.merged == true && + !contains(github.event.pull_request.title, '[skip sync]'))) + + steps: + - name: Determine platform from repo name + id: platform + run: | + REPO="${{ github.event.repository.name }}" + case "$REPO" in + Template-Joomla) PLATFORM="joomla" ;; + Template-Dolibarr) PLATFORM="dolibarr" ;; + Template-Go) PLATFORM="go" ;; + Template-NPM) PLATFORM="npm" ;; + Template-Generic) PLATFORM="" ;; + *) PLATFORM="" ;; + esac + echo "platform=$PLATFORM" >> "$GITHUB_OUTPUT" + echo "Platform: ${PLATFORM:-all}" + + - name: Clone MokoCLI + env: + MOKOGIT_TOKEN: ${{ secrets.MOKOGIT_TOKEN }} + run: | + MOKOGIT_URL="${{ vars.GITEA_URL || 'https://git.mokoconsulting.tech' }}" + git clone --depth 1 "${MOKOGIT_URL}/MokoConsulting/mokocli.git" /tmp/mokocli + + - name: Install PHP + run: | + if ! command -v php &> /dev/null; then + apt-get update -qq && apt-get install -y -qq php-cli php-json php-curl > /dev/null 2>&1 + fi + + - name: Install dependencies + run: | + cd /tmp/mokocli + composer install --no-dev --no-interaction --quiet 2>/dev/null || true + + - name: Run workflow sync + env: + MOKOGIT_TOKEN: ${{ secrets.MOKOGIT_TOKEN }} + run: | + ARGS="--token ${MOKOGIT_TOKEN}" + ARGS="${ARGS} --org ${{ vars.GITEA_ORG || github.repository_owner }}" + ARGS="${ARGS} --phase repos" + ARGS="${ARGS} --delete-orphans" + + PLATFORM="${{ steps.platform.outputs.platform }}" + if [ -n "$PLATFORM" ]; then + ARGS="${ARGS} --platform-filter ${PLATFORM}" + fi + + php /tmp/mokocli/cli/workflow_sync.php ${ARGS} diff --git a/.mokogit/workflows/gitleaks.yml b/.mokogit/workflows/gitleaks.yml index 0d272ae..cea7c9e 100644 --- a/.mokogit/workflows/gitleaks.yml +++ b/.mokogit/workflows/gitleaks.yml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow +# DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.Security # REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli # PATH: /templates/workflows/gitleaks.yml.template diff --git a/.mokogit/workflows/issue-branch.yml b/.mokogit/workflows/issue-branch.yml index e736ca8..3806e43 100644 --- a/.mokogit/workflows/issue-branch.yml +++ b/.mokogit/workflows/issue-branch.yml @@ -5,7 +5,7 @@ # FILE INFORMATION # DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.Automation -# VERSION: 01.00.00 +# VERSION: 02.29.12 # BRIEF: Auto-create feature branch when an issue is opened name: "Universal: Issue Branch" diff --git a/.mokogit/workflows/notify.yml b/.mokogit/workflows/notify.yml index f2ad215..f51ad68 100644 --- a/.mokogit/workflows/notify.yml +++ b/.mokogit/workflows/notify.yml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow +# DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.Notifications # REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli # PATH: /.mokogit/workflows/notify.yml diff --git a/.mokogit/workflows/pr-check.yml b/.mokogit/workflows/pr-check.yml index cb9e52c..1c75f14 100644 --- a/.mokogit/workflows/pr-check.yml +++ b/.mokogit/workflows/pr-check.yml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow +# DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.CI # REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli # PATH: /templates/workflows/universal/pr-check.yml.template @@ -149,7 +149,7 @@ jobs: - name: Detect platform id: platform run: | - # Platform comes from the MokoGit metadata API (public GET); manifest.xml is no longer used. + # Platform comes from the MokoGIT metadata API (public GET); manifest.xml is no longer used. API="${GITHUB_SERVER_URL:-https://git.mokoconsulting.tech}/api/v1/repos/${GITHUB_REPOSITORY}/metadata" PLATFORM="$(curl -sf "$API" 2>/dev/null | python3 -c "import sys, json; print(json.load(sys.stdin).get('platform') or '')" 2>/dev/null || true)" [ -z "$PLATFORM" ] && PLATFORM="generic" @@ -285,10 +285,10 @@ jobs: for ELEMENT in name version description; do grep -q "<${ELEMENT}>" "$MANIFEST" || { echo "::error::Missing <${ELEMENT}> in manifest"; exit 1; } done - # Block legacy raw/branch update server URLs on MokoGit + # Block legacy raw/branch update server URLs on MokoGIT RAW_URLS=$(grep -n 'raw/branch' "$MANIFEST" | grep -i 'mokoconsulting\|mokogit\|git\.mokoconsulting\.tech' || true) if [ -n "$RAW_URLS" ]; then - echo "::error::Manifest contains legacy raw/branch update server URL on MokoGit. Use the MokoGit Pages URL instead (e.g. /{REPO}/updates.xml not /{REPO}/raw/branch/main/updates.xml)" + echo "::error::Manifest contains legacy raw/branch update server URL on MokoGIT. Use the MokoGIT Pages URL instead (e.g. /{REPO}/updates.xml not /{REPO}/raw/branch/main/updates.xml)" echo "$RAW_URLS" exit 1 fi diff --git a/.mokogit/workflows/pr-metadata-check.yml b/.mokogit/workflows/pr-metadata-check.yml index ba552d2..01d4ddc 100644 --- a/.mokogit/workflows/pr-metadata-check.yml +++ b/.mokogit/workflows/pr-metadata-check.yml @@ -3,12 +3,12 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow +# DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.Validation # REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli # PATH: /templates/workflows/joomla/pr-metadata-check.yml.template # VERSION: 01.00.00 -# BRIEF: Validate MokoGit metadata matches Joomla extension manifest on PRs +# BRIEF: Validate MokoGIT metadata matches Joomla extension manifest on PRs name: "Joomla: Metadata Validation" diff --git a/.mokogit/workflows/pre-release.yml b/.mokogit/workflows/pre-release.yml index 7a9031b..a1e5b62 100644 --- a/.mokogit/workflows/pre-release.yml +++ b/.mokogit/workflows/pre-release.yml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow +# DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.Release # REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli # PATH: /templates/workflows/universal/pre-release.yml.template @@ -245,7 +245,7 @@ jobs: --token "${{ secrets.MOKOGIT_TOKEN }}" --api-base "$API_BASE" \ --repo "${GIT_REPO}" --output /tmp || true - # updates.xml is generated dynamically by MokoGit license server + # updates.xml is generated dynamically by MokoGIT license server # No need to build, commit, or sync updates.xml from workflows - name: "Delete lesser pre-release channels (cascade)" diff --git a/.mokogit/workflows/rc-revert.yml b/.mokogit/workflows/rc-revert.yml index d91268a..e28d4bb 100644 --- a/.mokogit/workflows/rc-revert.yml +++ b/.mokogit/workflows/rc-revert.yml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow +# DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.Universal # REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli # PATH: /.mokogit/workflows/rc-revert.yml diff --git a/.mokogit/workflows/repo-health.yml b/.mokogit/workflows/repo-health.yml index 9422dff..dbf433b 100644 --- a/.mokogit/workflows/repo-health.yml +++ b/.mokogit/workflows/repo-health.yml @@ -6,7 +6,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow +# DEFGROUP: MokoGIT.Workflow # INGROUP: MokoCLI.Validation # REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli # PATH: /templates/workflows/joomla/repo_health.yml.template @@ -605,7 +605,7 @@ jobs: printf '%s\n' '| Domain | Status | Notes |' printf '%s\n' '|---|---|---|' printf '%s\n' '| Access control | OK | Admin-only execution gate |' - printf '%s\n' '| Release policy | N/A | Releases handled by MokoGit |' + printf '%s\n' '| Release policy | N/A | Releases handled by MokoGIT |' printf '%s\n' '| Scripts governance | OK | Directory policy and advisory reporting |' printf '%s\n' '| Repo required artifacts | OK | Required, optional, disallowed enforcement |' printf '%s\n' '| Repo content heuristics | OK | Brand, license, changelog structure |' diff --git a/.mokogit/workflows/version-set.yml b/.mokogit/workflows/version-set.yml index 73a33f6..d451b9b 100644 --- a/.mokogit/workflows/version-set.yml +++ b/.mokogit/workflows/version-set.yml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later # # FILE INFORMATION -# DEFGROUP: MokoGit.Workflow.Template +# DEFGROUP: MokoGIT.Workflow.Template # INGROUP: MokoCLI.CI # REPO: https://git.mokoconsulting.tech/MokoConsulting/Template-Joomla # PATH: /.mokogit/workflows/version-set.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fd20d3..8de0b7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,11 +8,11 @@ DEFGROUP: Joomla.Template.Site INGROUP: MokoOnyx.Documentation PATH: ./CHANGELOG.md - VERSION: 02.29.00 + VERSION: 02.29.12 BRIEF: Changelog file documenting version history of MokoOnyx --> -# Changelog — MokoOnyx (VERSION: 02.29.00) +# Changelog — MokoOnyx (VERSION: 02.29.12) ## [Unreleased] ## [02.29.00] --- 2026-07-13 diff --git a/SECURITY.md b/SECURITY.md index f21ebc1..632a5ee 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -10,7 +10,7 @@ INGROUP: MokoOnyx.Governance REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx FILE: SECURITY.md - VERSION: 02.29.00 + VERSION: 02.29.12 BRIEF: Security policy and vulnerability reporting process for MokoOnyx. PATH: /SECURITY.md NOTE: This policy is process oriented and does not replace secure engineering practices. diff --git a/source/html/layouts/joomla/module/card.php b/source/html/layouts/joomla/module/card.php index 188f272..ecdfe7e 100644 --- a/source/html/layouts/joomla/module/card.php +++ b/source/html/layouts/joomla/module/card.php @@ -10,7 +10,7 @@ * INGROUP: MokoOnyx * REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx * PATH: /html/layouts/joomla/module/card.php - * VERSION: 02.29.00 + * VERSION: 02.29.12 * BRIEF: Custom card module chrome — renders module titles for all modules */ diff --git a/source/html/layouts/mokoonyx/article-metadata.php b/source/html/layouts/mokoonyx/article-metadata.php index 784d7d2..f554e3a 100644 --- a/source/html/layouts/mokoonyx/article-metadata.php +++ b/source/html/layouts/mokoonyx/article-metadata.php @@ -11,7 +11,7 @@ * INGROUP: MokoOnyx.Layouts * REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx * PATH: /src/html/layouts/mokoonyx/article-metadata.php - * VERSION: 02.29.00 + * VERSION: 02.29.12 * BRIEF: Article metadata footer layout -- renders jcfields grouped by field group */ diff --git a/source/media/css/a11y-high-contrast.css b/source/media/css/a11y-high-contrast.css index 8a0d312..78c4f3e 100644 --- a/source/media/css/a11y-high-contrast.css +++ b/source/media/css/a11y-high-contrast.css @@ -10,7 +10,7 @@ * INGROUP: MokoOnyx.Accessibility * REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx * PATH: ./media/css/a11y-high-contrast.css - * VERSION: 02.29.00 + * VERSION: 02.29.12 * BRIEF: High-contrast stylesheet for accessibility toolbar */ diff --git a/source/templateDetails.xml b/source/templateDetails.xml index b5aeab8..05c1591 100644 --- a/source/templateDetails.xml +++ b/source/templateDetails.xml @@ -35,7 +35,7 @@ mokoonyx - 02.29.00 + 02.29.12 script.php 2026-05-16 Jonathan Miller || Moko Consulting