@mokoconsulting/mcp-mokogitea-api 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/.gitattributes +94 -0
  2. package/.gitmessage +9 -0
  3. package/.mokogitea/ISSUE_TEMPLATE/adr.md +110 -0
  4. package/.mokogitea/ISSUE_TEMPLATE/bug_report.md +48 -0
  5. package/.mokogitea/ISSUE_TEMPLATE/config.yml +18 -0
  6. package/.mokogitea/ISSUE_TEMPLATE/documentation.md +52 -0
  7. package/.mokogitea/ISSUE_TEMPLATE/enterprise_support.md +85 -0
  8. package/.mokogitea/ISSUE_TEMPLATE/feature_request.md +51 -0
  9. package/.mokogitea/ISSUE_TEMPLATE/firewall-request.md +190 -0
  10. package/.mokogitea/ISSUE_TEMPLATE/mcp_api_integration.md +48 -0
  11. package/.mokogitea/ISSUE_TEMPLATE/mcp_connection_issue.md +67 -0
  12. package/.mokogitea/ISSUE_TEMPLATE/mcp_tool_request.md +49 -0
  13. package/.mokogitea/ISSUE_TEMPLATE/question.md +82 -0
  14. package/.mokogitea/ISSUE_TEMPLATE/rfc.md +126 -0
  15. package/.mokogitea/ISSUE_TEMPLATE/security.md +51 -0
  16. package/.mokogitea/ISSUE_TEMPLATE/version.md +24 -0
  17. package/.mokogitea/auto-assign.yml +76 -0
  18. package/.mokogitea/auto-dev-issue.yml +207 -0
  19. package/.mokogitea/auto-release.yml +337 -0
  20. package/.mokogitea/branch-protection.yml +251 -0
  21. package/.mokogitea/changelog-validation.yml +101 -0
  22. package/.mokogitea/codeql-analysis.yml +115 -0
  23. package/.mokogitea/copilot-agent.yml +44 -0
  24. package/.mokogitea/deploy-demo.yml +734 -0
  25. package/.mokogitea/deploy-dev.yml +700 -0
  26. package/.mokogitea/enterprise-firewall-setup.yml +758 -0
  27. package/.mokogitea/manifest.xml +25 -0
  28. package/.mokogitea/mcp-auto-release.yml +278 -0
  29. package/.mokogitea/mcp-build-test.yml +65 -0
  30. package/.mokogitea/mcp-sdk-check.yml +109 -0
  31. package/.mokogitea/mcp-tool-inventory.yml +61 -0
  32. package/.mokogitea/pr-branch-check.yml +90 -0
  33. package/.mokogitea/repository-cleanup.yml +525 -0
  34. package/.mokogitea/standards-compliance.yml +2614 -0
  35. package/.mokogitea/sync-version-on-merge.yml +133 -0
  36. package/.mokogitea/workflows/auto-assign.yml +76 -0
  37. package/.mokogitea/workflows/auto-bump.yml +66 -0
  38. package/.mokogitea/workflows/auto-dev-issue.yml +207 -0
  39. package/.mokogitea/workflows/auto-release.yml +341 -0
  40. package/.mokogitea/workflows/branch-cleanup.yml +48 -0
  41. package/.mokogitea/workflows/cascade-dev.yml +10 -0
  42. package/.mokogitea/workflows/changelog-validation.yml +101 -0
  43. package/.mokogitea/workflows/ci-generic.yml +204 -0
  44. package/.mokogitea/workflows/cleanup.yml +87 -0
  45. package/.mokogitea/workflows/codeql-analysis.yml +115 -0
  46. package/.mokogitea/workflows/copilot-agent.yml +44 -0
  47. package/.mokogitea/workflows/deploy-manual.yml +126 -0
  48. package/.mokogitea/workflows/enterprise-firewall-setup.yml +758 -0
  49. package/.mokogitea/workflows/gitleaks.yml +96 -0
  50. package/.mokogitea/workflows/issue-branch.yml +73 -0
  51. package/.mokogitea/workflows/mcp-auto-release.yml +280 -0
  52. package/.mokogitea/workflows/mcp-build-test.yml +65 -0
  53. package/.mokogitea/workflows/mcp-sdk-check.yml +109 -0
  54. package/.mokogitea/workflows/mcp-tool-inventory.yml +61 -0
  55. package/.mokogitea/workflows/notify.yml +70 -0
  56. package/.mokogitea/workflows/npm-publish.yml +51 -0
  57. package/.mokogitea/workflows/pr-check.yml +508 -0
  58. package/.mokogitea/workflows/pre-release.yml +11 -0
  59. package/.mokogitea/workflows/repo-health.yml +711 -0
  60. package/.mokogitea/workflows/repository-cleanup.yml +525 -0
  61. package/.mokogitea/workflows/security-audit.yml +82 -0
  62. package/.mokogitea/workflows/standards-compliance.yml +2614 -0
  63. package/.mokogitea/workflows/sync-version-on-merge.yml +130 -0
  64. package/.mokogitea/workflows/update-server.yml +312 -0
  65. package/CHANGELOG.md +145 -0
  66. package/CLAUDE.md +43 -0
  67. package/CONTRIBUTING.md +161 -0
  68. package/README.md +286 -0
  69. package/SECURITY.md +91 -0
  70. package/automation/ci-issue-reporter.sh +237 -0
  71. package/config.example.json +13 -0
  72. package/dist/client.d.ts +15 -0
  73. package/dist/client.js +104 -0
  74. package/dist/config.d.ts +4 -0
  75. package/dist/config.js +48 -0
  76. package/dist/index.d.ts +3 -0
  77. package/dist/index.js +1119 -0
  78. package/dist/types.d.ts +20 -0
  79. package/dist/types.js +16 -0
  80. package/package.json +34 -0
  81. package/scripts/setup.mjs +40 -0
  82. package/src/client.ts +120 -0
  83. package/src/config.ts +58 -0
  84. package/src/index.ts +1712 -0
  85. package/src/types.ts +37 -0
  86. package/tsconfig.json +19 -0
@@ -0,0 +1,341 @@
1
+ # Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
2
+ #
3
+ # SPDX-License-Identifier: GPL-3.0-or-later
4
+ #
5
+ # FILE INFORMATION
6
+ # DEFGROUP: Gitea.Workflow
7
+ # INGROUP: moko-platform.Release
8
+ # REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/moko-platform
9
+ # PATH: /templates/workflows/universal/auto-release.yml.template
10
+ # VERSION: 05.00.00
11
+ # BRIEF: Universal build & release � detects platform from manifest.xml
12
+ #
13
+ # +========================================================================+
14
+ # | UNIVERSAL BUILD & RELEASE PIPELINE |
15
+ # +========================================================================+
16
+ # | |
17
+ # | Reads manifest.xml (joomla|dolibarr|generic) to branch logic. |
18
+ # | |
19
+ # | Platform-specific: |
20
+ # | joomla: XML manifest, type-prefixed packages |
21
+ # | dolibarr: mod*.class.php, update.txt, dev version reset |
22
+ # | generic: README-only, no update stream |
23
+ # | |
24
+ # +========================================================================+
25
+
26
+ name: "Universal: Build & Release"
27
+
28
+ on:
29
+ pull_request:
30
+ types: [opened, closed]
31
+ branches:
32
+ - main
33
+ workflow_dispatch:
34
+ inputs:
35
+ action:
36
+ description: 'Action to perform'
37
+ required: false
38
+ type: choice
39
+ default: release
40
+ options:
41
+ - release
42
+ - promote-rc
43
+
44
+ env:
45
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
46
+ GITEA_URL: ${{ vars.GITEA_URL || 'https://git.mokoconsulting.tech' }}
47
+ GITEA_ORG: ${{ vars.GITEA_ORG || github.repository_owner }}
48
+ GITEA_REPO: ${{ vars.GITEA_REPO || github.event.repository.name }}
49
+
50
+ permissions:
51
+ contents: write
52
+
53
+ jobs:
54
+ # ── PR Opened → Rename branch to RC and build RC release ─────────────────────
55
+ promote-rc:
56
+ name: Promote to RC
57
+ runs-on: release
58
+ if: >-
59
+ (github.event.action == 'opened' && github.event.pull_request.merged != true) ||
60
+ (github.event_name == 'workflow_dispatch' && inputs.action == 'promote-rc')
61
+
62
+ steps:
63
+ - name: Checkout repository
64
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
65
+ with:
66
+ token: ${{ secrets.MOKOGITEA_TOKEN }}
67
+ fetch-depth: 1
68
+
69
+ - name: Setup moko-platform tools
70
+ env:
71
+ MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }}
72
+ MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting
73
+ run: |
74
+ if [ -f /opt/moko-platform/cli/version_bump.php ] && [ -f /opt/moko-platform/vendor/autoload.php ]; then
75
+ echo Using pre-installed /opt/moko-platform
76
+ echo MOKO_CLI=/opt/moko-platform/cli >> $GITHUB_ENV
77
+ else
78
+ echo Falling back to fresh clone
79
+ if ! command -v composer > /dev/null 2>&1; then
80
+ sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer > /dev/null 2>&1
81
+ fi
82
+ rm -rf /tmp/moko-platform-api
83
+ CLONE_URL=https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git
84
+ git clone --depth 1 --branch main --quiet $CLONE_URL /tmp/moko-platform-api
85
+ cd /tmp/moko-platform-api
86
+ composer install --no-dev --no-interaction --quiet
87
+ echo MOKO_CLI=/tmp/moko-platform-api/cli >> $GITHUB_ENV
88
+ fi
89
+
90
+ - name: Rename branch to rc
91
+ run: |
92
+ php ${MOKO_CLI}/branch_rename.php \
93
+ --from "${{ github.event.pull_request.head.ref || 'dev' }}" --to rc \
94
+ --token "${{ secrets.MOKOGITEA_TOKEN }}" \
95
+ --api-base "${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}" \
96
+ --pr "${{ github.event.pull_request.number }}"
97
+
98
+ - name: Checkout rc and configure git
99
+ run: |
100
+ git fetch origin rc
101
+ git checkout rc
102
+ git config --local user.email "gitea-actions[bot]@mokoconsulting.tech"
103
+ git config --local user.name "gitea-actions[bot]"
104
+ git remote set-url origin "https://x-access-token:${{ secrets.MOKOGITEA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git"
105
+
106
+ - name: Publish RC release
107
+ run: |
108
+ php ${MOKO_CLI}/release_publish.php \
109
+ --path . --stability rc --bump minor --branch rc \
110
+ --token "${{ secrets.MOKOGITEA_TOKEN }}"
111
+
112
+ - name: Summary
113
+ if: always()
114
+ run: |
115
+ echo "## Promoted to Release Candidate" >> $GITHUB_STEP_SUMMARY
116
+ echo "Branch renamed to rc, minor bump, RC release built" >> $GITHUB_STEP_SUMMARY
117
+
118
+ # ── Merged PR → Build & Release (or promote RC to stable) ────────────────────
119
+ release:
120
+ name: Build & Release Pipeline
121
+ runs-on: release
122
+ if: >-
123
+ github.event.pull_request.merged == true ||
124
+ (github.event_name == 'workflow_dispatch' && inputs.action != 'promote-rc')
125
+
126
+ steps:
127
+ - name: Checkout repository
128
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
129
+ with:
130
+ token: ${{ secrets.MOKOGITEA_TOKEN }}
131
+ fetch-depth: 0
132
+
133
+ - name: Configure git for bot pushes
134
+ run: |
135
+ git config --local user.email "gitea-actions[bot]@mokoconsulting.tech"
136
+ git config --local user.name "gitea-actions[bot]"
137
+ git remote set-url origin "https://x-access-token:${{ secrets.MOKOGITEA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git"
138
+
139
+ - name: Check for merge conflict markers
140
+ run: |
141
+ CONFLICTS=$(grep -rn '<<<<<<< \|>>>>>>> \|^=======$' --include='*.php' --include='*.xml' --include='*.css' --include='*.js' --include='*.json' --include='*.md' --include='*.yml' --include='*.yaml' --include='*.ini' --include='*.txt' . 2>/dev/null | grep -v '.git/' || true)
142
+ if [ -n "$CONFLICTS" ]; then
143
+ echo "::error::Merge conflict markers found — aborting release"
144
+ echo "## Release Blocked: Conflict Markers" >> $GITHUB_STEP_SUMMARY
145
+ echo '```' >> $GITHUB_STEP_SUMMARY
146
+ echo "$CONFLICTS" >> $GITHUB_STEP_SUMMARY
147
+ echo '```' >> $GITHUB_STEP_SUMMARY
148
+ exit 1
149
+ fi
150
+ echo "No conflict markers found"
151
+
152
+ - name: Setup moko-platform tools
153
+ env:
154
+ MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }}
155
+ MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting
156
+ COMPOSER_AUTH: '{"github-oauth":{"github.com":"${{ secrets.GH_MIRROR_TOKEN }}"}}'
157
+ run: |
158
+ if [ -f /opt/moko-platform/cli/version_bump.php ] && [ -f /opt/moko-platform/vendor/autoload.php ]; then
159
+ echo Using pre-installed /opt/moko-platform
160
+ echo MOKO_CLI=/opt/moko-platform/cli >> $GITHUB_ENV
161
+ else
162
+ echo Falling back to fresh clone
163
+ if ! command -v composer > /dev/null 2>&1; then
164
+ sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer > /dev/null 2>&1
165
+ fi
166
+ rm -rf /tmp/moko-platform-api
167
+ CLONE_URL=https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git
168
+ git clone --depth 1 --branch main --quiet $CLONE_URL /tmp/moko-platform-api
169
+ cd /tmp/moko-platform-api
170
+ composer install --no-dev --no-interaction --quiet
171
+ echo MOKO_CLI=/tmp/moko-platform-api/cli >> $GITHUB_ENV
172
+ fi
173
+
174
+ - name: "Determine version bump level"
175
+ id: bump
176
+ run: |
177
+ # Fix/patch branches: version was already bumped by pre-release, just strip suffix
178
+ # Feature/dev branches: bump minor for the new stable release
179
+ HEAD_REF="${{ github.event.pull_request.head.ref || 'dev' }}"
180
+ case "$HEAD_REF" in
181
+ fix/*|patch/*|hotfix/*|bugfix/*) BUMP="none" ;;
182
+ *) BUMP="minor" ;;
183
+ esac
184
+ echo "level=${BUMP}" >> "$GITHUB_OUTPUT"
185
+ echo "Bump level: ${BUMP} (from branch: ${HEAD_REF})"
186
+
187
+ - name: "Publish stable release"
188
+ run: |
189
+ BUMP_FLAG=""
190
+ if [ "${{ steps.bump.outputs.level }}" != "none" ]; then
191
+ BUMP_FLAG="--bump ${{ steps.bump.outputs.level }}"
192
+ fi
193
+ php ${MOKO_CLI}/release_publish.php \
194
+ --path . --stability stable ${BUMP_FLAG} --branch main \
195
+ --token "${{ secrets.MOKOGITEA_TOKEN }}"
196
+
197
+ - name: Update release notes from CHANGELOG.md
198
+ run: |
199
+ API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
200
+
201
+ # Extract [Unreleased] section from changelog
202
+ if [ -f "CHANGELOG.md" ]; then
203
+ NOTES=$(awk '/^## \[Unreleased\]/{found=1; next} /^## \[/{if(found) exit} found{print}' CHANGELOG.md)
204
+ [ -z "$NOTES" ] && NOTES="Stable release"
205
+ else
206
+ NOTES="Stable release"
207
+ fi
208
+
209
+ # Update release body via API
210
+ RELEASE_ID=$(curl -sf -H "Authorization: token ${{ secrets.MOKOGITEA_TOKEN }}" \
211
+ "${API_BASE}/releases/tags/stable" | python3 -c "import json,sys; print(json.load(sys.stdin).get('id',''))" 2>/dev/null || true)
212
+
213
+ if [ -n "$RELEASE_ID" ]; then
214
+ python3 -c "
215
+ import json, urllib.request
216
+ body = open('/dev/stdin').read()
217
+ payload = json.dumps({'body': body}).encode()
218
+ req = urllib.request.Request(
219
+ '${API_BASE}/releases/${RELEASE_ID}',
220
+ data=payload, method='PATCH',
221
+ headers={
222
+ 'Authorization': 'token ${{ secrets.MOKOGITEA_TOKEN }}',
223
+ 'Content-Type': 'application/json'
224
+ })
225
+ urllib.request.urlopen(req)
226
+ " <<< "$NOTES"
227
+ echo "Release notes updated from CHANGELOG.md"
228
+ fi
229
+
230
+ # -- STEP 9: Mirror to GitHub (stable only) --------------------------------
231
+ - name: "Step 9: Mirror release to GitHub"
232
+ if: >-
233
+ steps.version.outputs.skip != 'true' &&
234
+ secrets.GH_MIRROR_TOKEN != ''
235
+ continue-on-error: true
236
+ run: |
237
+ VERSION="${{ steps.bump.outputs.version || steps.version.outputs.version }}"
238
+ RELEASE_TAG="${{ steps.version.outputs.release_tag }}"
239
+ GH_REPO="${{ vars.GH_MIRROR_REPO || github.repository }}"
240
+ API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
241
+ php ${MOKO_CLI}/release_mirror.php \
242
+ --version "$VERSION" --tag "$RELEASE_TAG" \
243
+ --token "${{ secrets.MOKOGITEA_TOKEN }}" --api-base "$API_BASE" \
244
+ --gh-token "${{ secrets.GH_MIRROR_TOKEN }}" --gh-repo "$GH_REPO" \
245
+ --branch main 2>&1 || true
246
+ echo "GitHub mirror updated" >> $GITHUB_STEP_SUMMARY
247
+
248
+ # -- STEP 10: Sync main branch to GitHub mirror ----------------------------
249
+ - name: "Step 10: Push main to GitHub mirror"
250
+ if: >-
251
+ steps.version.outputs.skip != 'true' &&
252
+ secrets.GH_MIRROR_TOKEN != ''
253
+ continue-on-error: true
254
+ run: |
255
+ GH_REPO="${{ vars.GH_MIRROR_REPO || github.repository }}"
256
+ GH_ORG=$(echo "$GH_REPO" | cut -d/ -f1)
257
+ GH_NAME=$(echo "$GH_REPO" | cut -d/ -f2)
258
+ git remote add github "https://x-access-token:${{ secrets.GH_MIRROR_TOKEN }}@github.com/${GH_ORG}/${GH_NAME}.git" 2>/dev/null || \
259
+ git remote set-url github "https://x-access-token:${{ secrets.GH_MIRROR_TOKEN }}@github.com/${GH_ORG}/${GH_NAME}.git"
260
+ git fetch origin main --depth=1
261
+ git push github origin/main:refs/heads/main --force 2>/dev/null \
262
+ && echo "main branch pushed to GitHub mirror" \
263
+ || echo "WARNING: GitHub mirror push failed"
264
+
265
+ - name: "Step 11: Delete rc branch and recreate dev from main"
266
+ if: steps.version.outputs.skip != 'true'
267
+ continue-on-error: true
268
+ run: |
269
+ API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
270
+ TOKEN="${{ secrets.MOKOGITEA_TOKEN }}"
271
+
272
+ # Delete rc branch (ephemeral — created by promote-rc)
273
+ curl -sf -X DELETE -H "Authorization: token ${TOKEN}" \
274
+ "${API_BASE}/branches/rc" 2>/dev/null \
275
+ && echo "Deleted rc branch" || echo "rc branch not found"
276
+
277
+ # Delete dev branch
278
+ curl -sf -X DELETE -H "Authorization: token ${TOKEN}" \
279
+ "${API_BASE}/branches/dev" 2>/dev/null && echo "Deleted dev branch"
280
+
281
+ # Recreate dev from main (now includes version bump + changelog promotion)
282
+ curl -sf -X POST -H "Authorization: token ${TOKEN}" \
283
+ -H "Content-Type: application/json" \
284
+ "${API_BASE}/branches" \
285
+ -d '{"new_branch_name":"dev","old_branch_name":"main"}' 2>/dev/null && echo "Recreated dev from main"
286
+
287
+ echo "Pre-release branches cleaned, dev reset from main" >> $GITHUB_STEP_SUMMARY
288
+
289
+ - name: "Step 12: Create version branch from main"
290
+ if: steps.version.outputs.skip != 'true'
291
+ continue-on-error: true
292
+ run: |
293
+ API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
294
+ TOKEN="${{ secrets.MOKOGITEA_TOKEN }}"
295
+ VERSION="${{ steps.bump.outputs.version || steps.version.outputs.version }}"
296
+ BRANCH_NAME="version/${VERSION}"
297
+ MAIN_SHA=$(git rev-parse HEAD)
298
+
299
+ # Delete old version branch if it exists (same version re-release)
300
+ curl -sf -X DELETE -H "Authorization: token ${TOKEN}" "${API_BASE}/branches/${BRANCH_NAME}" 2>/dev/null && echo "Deleted old ${BRANCH_NAME}"
301
+
302
+ # Create version/XX.YY.ZZ from main
303
+ curl -sf -X POST -H "Authorization: token ${TOKEN}" -H "Content-Type: application/json" "${API_BASE}/branches" -d "{\"new_branch_name\":\"${BRANCH_NAME}\",\"old_branch_name\":\"main\"}" 2>/dev/null && echo "Created ${BRANCH_NAME} from main (${MAIN_SHA})" || echo "WARNING: ${BRANCH_NAME} creation failed"
304
+
305
+ echo "Version branch created: ${BRANCH_NAME} (${MAIN_SHA})" >> $GITHUB_STEP_SUMMARY
306
+
307
+
308
+
309
+ # -- Dolibarr post-release: Reset dev version -----------------------------
310
+ - name: "Post-release: Reset dev version"
311
+ if: steps.version.outputs.skip != 'true'
312
+ continue-on-error: true
313
+ run: |
314
+ API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
315
+ php ${MOKO_CLI}/version_reset_dev.php \
316
+ --token "${{ secrets.MOKOGITEA_TOKEN }}" --api-base "${API_BASE}" \
317
+ --branch dev --path . 2>&1 || true
318
+
319
+ # -- Summary --------------------------------------------------------------
320
+ - name: Pipeline Summary
321
+ if: always()
322
+ run: |
323
+ VERSION="${{ steps.bump.outputs.version || steps.version.outputs.version }}"
324
+ PLATFORM="${{ steps.platform.outputs.platform }}"
325
+ if [ "${{ steps.version.outputs.skip }}" = "true" ]; then
326
+ echo "## Release Skipped" >> $GITHUB_STEP_SUMMARY
327
+ echo "No VERSION in README.md" >> $GITHUB_STEP_SUMMARY
328
+ elif [ "${{ steps.check.outputs.already_released }}" = "true" ]; then
329
+ echo "## Already Released — ${VERSION}" >> $GITHUB_STEP_SUMMARY
330
+ else
331
+ echo "" >> $GITHUB_STEP_SUMMARY
332
+ echo "## Build & Release Complete (${PLATFORM})" >> $GITHUB_STEP_SUMMARY
333
+ echo "" >> $GITHUB_STEP_SUMMARY
334
+ echo "| Step | Result |" >> $GITHUB_STEP_SUMMARY
335
+ echo "|------|--------|" >> $GITHUB_STEP_SUMMARY
336
+ echo "| Platform | \`${PLATFORM}\` |" >> $GITHUB_STEP_SUMMARY
337
+ echo "| Version | \`${VERSION}\` |" >> $GITHUB_STEP_SUMMARY
338
+ echo "| Branch | \`${{ steps.version.outputs.branch }}\` |" >> $GITHUB_STEP_SUMMARY
339
+ echo "| Tag | \`${{ steps.version.outputs.tag }}\` |" >> $GITHUB_STEP_SUMMARY
340
+ echo "| Release | [View](${GITEA_URL}/${GITEA_ORG}/${GITEA_REPO}/releases/tag/${{ steps.version.outputs.tag }}) |" >> $GITHUB_STEP_SUMMARY
341
+ fi
@@ -0,0 +1,48 @@
1
+ # Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
2
+ #
3
+ # SPDX-License-Identifier: GPL-3.0-or-later
4
+ #
5
+ # FILE INFORMATION
6
+ # DEFGROUP: Gitea.Workflow
7
+ # INGROUP: MokoStandards.Universal
8
+ # REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform
9
+ # PATH: /.mokogitea/workflows/branch-cleanup.yml
10
+ # VERSION: 01.00.00
11
+ # BRIEF: Delete feature branches after PR merge
12
+
13
+ name: "Branch Cleanup"
14
+
15
+ on:
16
+ pull_request:
17
+ types: [closed]
18
+
19
+ env:
20
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
21
+
22
+ jobs:
23
+ cleanup:
24
+ name: Delete merged branch
25
+ runs-on: ubuntu-latest
26
+ if: >-
27
+ github.event.pull_request.merged == true &&
28
+ github.event.pull_request.head.ref != 'dev' &&
29
+ github.event.pull_request.head.ref != 'main'
30
+
31
+ steps:
32
+ - name: Delete source branch
33
+ run: |
34
+ BRANCH="${{ github.event.pull_request.head.ref }}"
35
+ API="${{ vars.GITEA_URL || 'https://git.mokoconsulting.tech' }}/api/v1/repos/${{ github.repository }}/branches"
36
+ ENCODED=$(php -r "echo rawurlencode('${BRANCH}');")
37
+
38
+ STATUS=$(curl -sf -o /dev/null -w "%{http_code}" -X DELETE \
39
+ -H "Authorization: token ${{ secrets.MOKOGITEA_TOKEN }}" \
40
+ "${API}/${ENCODED}" 2>/dev/null || true)
41
+
42
+ if [ "$STATUS" = "204" ]; then
43
+ echo "Deleted branch: ${BRANCH}" >> $GITHUB_STEP_SUMMARY
44
+ elif [ "$STATUS" = "404" ]; then
45
+ echo "Branch already deleted: ${BRANCH}" >> $GITHUB_STEP_SUMMARY
46
+ else
47
+ echo "::warning::Failed to delete branch ${BRANCH} (HTTP ${STATUS})"
48
+ fi
@@ -0,0 +1,10 @@
1
+ # DISABLED — auto-release Step 11 recreates dev from main after every release.
2
+ # Cascade-dev is redundant and causes version conflicts when both main and dev
3
+ # have different version numbers in templateDetails.xml / manifest.xml.
4
+ name: "Cascade Main → Dev (DISABLED)"
5
+ on: workflow_dispatch
6
+ jobs:
7
+ noop:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - run: echo "Cascade disabled — auto-release handles dev recreation"
@@ -0,0 +1,101 @@
1
+ # Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
2
+ #
3
+ # This file is part of a Moko Consulting project.
4
+ #
5
+ # SPDX-License-Identifier: GPL-3.0-or-later
6
+ #
7
+ # FILE INFORMATION
8
+ # DEFGROUP: GitHub.Workflow.Template
9
+ # INGROUP: MokoStandards.CI
10
+ # REPO: https://github.com/mokoconsulting-tech/MokoStandards
11
+ # PATH: /templates/workflows/shared/changelog-validation.yml.template
12
+ # VERSION: 04.06.00
13
+ # BRIEF: Validates CHANGELOG.md format and version consistency
14
+ # NOTE: Deployed to .mokogitea/workflows/changelog-validation.yml in governed repos.
15
+
16
+ name: "Universal: Changelog Validation"
17
+
18
+ on:
19
+ push:
20
+ branches:
21
+ - main
22
+ pull_request:
23
+ branches:
24
+ - main
25
+ workflow_dispatch:
26
+
27
+ permissions:
28
+ contents: read
29
+
30
+ env:
31
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
32
+
33
+ jobs:
34
+ validate-changelog:
35
+ name: Validate CHANGELOG.md
36
+ runs-on: ubuntu-latest
37
+
38
+ steps:
39
+ - name: Checkout repository
40
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
41
+
42
+ - name: Check CHANGELOG.md exists
43
+ run: |
44
+ echo "### Changelog Validation" >> $GITHUB_STEP_SUMMARY
45
+ if [ ! -f "CHANGELOG.md" ]; then
46
+ echo "CHANGELOG.md not found in repository root." >> $GITHUB_STEP_SUMMARY
47
+ exit 1
48
+ fi
49
+ echo "CHANGELOG.md exists." >> $GITHUB_STEP_SUMMARY
50
+
51
+ - name: Check VERSION header matches README.md
52
+ run: |
53
+ # Extract version from README.md FILE INFORMATION block
54
+ README_VERSION=$(grep -oP '^\s*VERSION:\s*\K[0-9]{2}\.[0-9]{2}\.[0-9]{2}' README.md | head -1)
55
+ if [ -z "$README_VERSION" ]; then
56
+ echo "No VERSION found in README.md FILE INFORMATION block." >> $GITHUB_STEP_SUMMARY
57
+ exit 1
58
+ fi
59
+
60
+ # Check that CHANGELOG.md has a matching version header
61
+ CHANGELOG_VERSION=$(grep -oP '^\#\#\s*\[\K[0-9]{2}\.[0-9]{2}\.[0-9]{2}' CHANGELOG.md | head -1)
62
+ if [ -z "$CHANGELOG_VERSION" ]; then
63
+ echo "No version header found in CHANGELOG.md (expected \`## [XX.YY.ZZ] - YYYY-MM-DD\`)." >> $GITHUB_STEP_SUMMARY
64
+ exit 1
65
+ fi
66
+
67
+ if [ "$CHANGELOG_VERSION" != "$README_VERSION" ]; then
68
+ echo "CHANGELOG latest version \`${CHANGELOG_VERSION}\` does not match README VERSION \`${README_VERSION}\`." >> $GITHUB_STEP_SUMMARY
69
+ exit 1
70
+ fi
71
+
72
+ echo "CHANGELOG version \`${CHANGELOG_VERSION}\` matches README VERSION." >> $GITHUB_STEP_SUMMARY
73
+
74
+ - name: Validate conventional changelog format
75
+ run: |
76
+ ERRORS=0
77
+
78
+ # Check that version entries follow ## [XX.YY.ZZ] - YYYY-MM-DD format
79
+ while IFS= read -r LINE; do
80
+ if ! echo "$LINE" | grep -qP '^\#\#\s*\[[0-9]{2}\.[0-9]{2}\.[0-9]{2}\]\s*-\s*[0-9]{4}-[0-9]{2}-[0-9]{2}'; then
81
+ echo "Malformed version header: \`${LINE}\`" >> $GITHUB_STEP_SUMMARY
82
+ echo " Expected format: \`## [XX.YY.ZZ] - YYYY-MM-DD\`" >> $GITHUB_STEP_SUMMARY
83
+ ERRORS=$((ERRORS + 1))
84
+ fi
85
+ done < <(grep -P '^\#\#\s*\[' CHANGELOG.md)
86
+
87
+ ENTRY_COUNT=$(grep -cP '^\#\#\s*\[' CHANGELOG.md || echo "0")
88
+ if [ "$ENTRY_COUNT" -eq 0 ]; then
89
+ echo "No version entries found in CHANGELOG.md." >> $GITHUB_STEP_SUMMARY
90
+ ERRORS=$((ERRORS + 1))
91
+ else
92
+ echo "Found ${ENTRY_COUNT} version entr(ies) in CHANGELOG.md." >> $GITHUB_STEP_SUMMARY
93
+ fi
94
+
95
+ echo "" >> $GITHUB_STEP_SUMMARY
96
+ if [ "${ERRORS}" -gt 0 ]; then
97
+ echo "**${ERRORS} format issue(s) found.**" >> $GITHUB_STEP_SUMMARY
98
+ exit 1
99
+ else
100
+ echo "**Changelog format validation passed.**" >> $GITHUB_STEP_SUMMARY
101
+ fi