@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.
- package/.gitattributes +94 -0
- package/.gitmessage +9 -0
- package/.mokogitea/ISSUE_TEMPLATE/adr.md +110 -0
- package/.mokogitea/ISSUE_TEMPLATE/bug_report.md +48 -0
- package/.mokogitea/ISSUE_TEMPLATE/config.yml +18 -0
- package/.mokogitea/ISSUE_TEMPLATE/documentation.md +52 -0
- package/.mokogitea/ISSUE_TEMPLATE/enterprise_support.md +85 -0
- package/.mokogitea/ISSUE_TEMPLATE/feature_request.md +51 -0
- package/.mokogitea/ISSUE_TEMPLATE/firewall-request.md +190 -0
- package/.mokogitea/ISSUE_TEMPLATE/mcp_api_integration.md +48 -0
- package/.mokogitea/ISSUE_TEMPLATE/mcp_connection_issue.md +67 -0
- package/.mokogitea/ISSUE_TEMPLATE/mcp_tool_request.md +49 -0
- package/.mokogitea/ISSUE_TEMPLATE/question.md +82 -0
- package/.mokogitea/ISSUE_TEMPLATE/rfc.md +126 -0
- package/.mokogitea/ISSUE_TEMPLATE/security.md +51 -0
- package/.mokogitea/ISSUE_TEMPLATE/version.md +24 -0
- package/.mokogitea/auto-assign.yml +76 -0
- package/.mokogitea/auto-dev-issue.yml +207 -0
- package/.mokogitea/auto-release.yml +337 -0
- package/.mokogitea/branch-protection.yml +251 -0
- package/.mokogitea/changelog-validation.yml +101 -0
- package/.mokogitea/codeql-analysis.yml +115 -0
- package/.mokogitea/copilot-agent.yml +44 -0
- package/.mokogitea/deploy-demo.yml +734 -0
- package/.mokogitea/deploy-dev.yml +700 -0
- package/.mokogitea/enterprise-firewall-setup.yml +758 -0
- package/.mokogitea/manifest.xml +25 -0
- package/.mokogitea/mcp-auto-release.yml +278 -0
- package/.mokogitea/mcp-build-test.yml +65 -0
- package/.mokogitea/mcp-sdk-check.yml +109 -0
- package/.mokogitea/mcp-tool-inventory.yml +61 -0
- package/.mokogitea/pr-branch-check.yml +90 -0
- package/.mokogitea/repository-cleanup.yml +525 -0
- package/.mokogitea/standards-compliance.yml +2614 -0
- package/.mokogitea/sync-version-on-merge.yml +133 -0
- package/.mokogitea/workflows/auto-assign.yml +76 -0
- package/.mokogitea/workflows/auto-bump.yml +66 -0
- package/.mokogitea/workflows/auto-dev-issue.yml +207 -0
- package/.mokogitea/workflows/auto-release.yml +341 -0
- package/.mokogitea/workflows/branch-cleanup.yml +48 -0
- package/.mokogitea/workflows/cascade-dev.yml +10 -0
- package/.mokogitea/workflows/changelog-validation.yml +101 -0
- package/.mokogitea/workflows/ci-generic.yml +204 -0
- package/.mokogitea/workflows/cleanup.yml +87 -0
- package/.mokogitea/workflows/codeql-analysis.yml +115 -0
- package/.mokogitea/workflows/copilot-agent.yml +44 -0
- package/.mokogitea/workflows/deploy-manual.yml +126 -0
- package/.mokogitea/workflows/enterprise-firewall-setup.yml +758 -0
- package/.mokogitea/workflows/gitleaks.yml +96 -0
- package/.mokogitea/workflows/issue-branch.yml +73 -0
- package/.mokogitea/workflows/mcp-auto-release.yml +280 -0
- package/.mokogitea/workflows/mcp-build-test.yml +65 -0
- package/.mokogitea/workflows/mcp-sdk-check.yml +109 -0
- package/.mokogitea/workflows/mcp-tool-inventory.yml +61 -0
- package/.mokogitea/workflows/notify.yml +70 -0
- package/.mokogitea/workflows/npm-publish.yml +51 -0
- package/.mokogitea/workflows/pr-check.yml +508 -0
- package/.mokogitea/workflows/pre-release.yml +11 -0
- package/.mokogitea/workflows/repo-health.yml +711 -0
- package/.mokogitea/workflows/repository-cleanup.yml +525 -0
- package/.mokogitea/workflows/security-audit.yml +82 -0
- package/.mokogitea/workflows/standards-compliance.yml +2614 -0
- package/.mokogitea/workflows/sync-version-on-merge.yml +130 -0
- package/.mokogitea/workflows/update-server.yml +312 -0
- package/CHANGELOG.md +145 -0
- package/CLAUDE.md +43 -0
- package/CONTRIBUTING.md +161 -0
- package/README.md +286 -0
- package/SECURITY.md +91 -0
- package/automation/ci-issue-reporter.sh +237 -0
- package/config.example.json +13 -0
- package/dist/client.d.ts +15 -0
- package/dist/client.js +104 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +48 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1119 -0
- package/dist/types.d.ts +20 -0
- package/dist/types.js +16 -0
- package/package.json +34 -0
- package/scripts/setup.mjs +40 -0
- package/src/client.ts +120 -0
- package/src/config.ts +58 -0
- package/src/index.ts +1712 -0
- package/src/types.ts +37 -0
- 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
|