From ecfeb19b981f6cdf99a52b279f2515a6cd0d7f84 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 23 May 2026 23:35:17 -0500 Subject: [PATCH] fix(ci): strip all non-ASCII from workflow YAML files Gitea Go YAML parser rejects UTF-8 multibyte characters (em dashes, arrows, emoji) as control characters. Replace with ASCII equivalents across all workflow files. Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) --- .mokogitea/workflows/cascade-dev.yml | 50 ++++++++++++++-------------- .mokogitea/workflows/ci-joomla.yml | 20 +++++------ .mokogitea/workflows/cleanup.yml | 2 +- .mokogitea/workflows/gitleaks.yml | 4 +-- .mokogitea/workflows/pr-check.yml | 22 ++++++------ .mokogitea/workflows/pre-release.yml | 16 ++++----- .mokogitea/workflows/repo-health.yml | 10 +++--- 7 files changed, 62 insertions(+), 62 deletions(-) diff --git a/.mokogitea/workflows/cascade-dev.yml b/.mokogitea/workflows/cascade-dev.yml index 23b11a2..7f26935 100644 --- a/.mokogitea/workflows/cascade-dev.yml +++ b/.mokogitea/workflows/cascade-dev.yml @@ -8,21 +8,21 @@ # REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/moko-platform # PATH: /templates/workflows/cascade-dev.yml.template # VERSION: 02.00.00 -# BRIEF: Forward-merge main → all open branches after every push to main +# BRIEF: Forward-merge main -> all open branches after every push to main # # +========================================================================+ -# | CASCADE MAIN → ALL BRANCHES | +# | CASCADE MAIN -> ALL BRANCHES | # +========================================================================+ # | | # | Triggers on every push to main (PR merges, bot commits, etc.) | # | | # | 1. List all branches matching: dev, rc/*, beta/*, alpha/* | -# | 2. For each: create PR (main → branch), auto-merge if clean | +# | 2. For each: create PR (main -> branch), auto-merge if clean | # | 3. On conflict: leave PR open for manual resolution | # | | # +========================================================================+ -name: "Universal: Cascade Main → Dev" +name: "Universal: Cascade Main -> Dev" on: push: @@ -42,7 +42,7 @@ permissions: jobs: cascade: - name: Cascade main → branches + name: Cascade main -> branches runs-on: ubuntu-latest if: >- !contains(github.event.head_commit.message, '[skip ci]') && @@ -83,11 +83,11 @@ jobs: if [ -z "$TARGETS" ]; then echo "targets=" >> "$GITHUB_OUTPUT" - echo "ℹ️ No cascade target branches found" + echo " No cascade target branches found" else echo "targets=$TARGETS" >> "$GITHUB_OUTPUT" COUNT=$(echo "$TARGETS" | wc -w) - echo "📋 Found ${COUNT} target branch(es): ${TARGETS}" + echo " Found ${COUNT} target branch(es): ${TARGETS}" fi - name: Cascade to all target branches @@ -106,7 +106,7 @@ jobs: for BRANCH in $TARGETS; do echo "" - echo "═══ main → ${BRANCH} ═══" + echo " main -> ${BRANCH} " # Check if branch is already up to date ENCODED_BRANCH=$(echo "$BRANCH" | sed 's|/|%2F|g') @@ -117,12 +117,12 @@ jobs: AHEAD=$(echo "$RESPONSE" | jq '.total_commits // 0') if [ "$AHEAD" -eq 0 ]; then - echo " ✅ Already up to date" + echo " Already up to date" SKIPPED=$((SKIPPED + 1)) continue fi - echo " ℹ️ main is ${AHEAD} commit(s) ahead" + echo " main is ${AHEAD} commit(s) ahead" # Check for existing cascade PR EXISTING=$(curl -sS \ @@ -134,7 +134,7 @@ jobs: if [ "$EXISTING_COUNT" -gt 0 ]; then PR_NUMBER=$(echo "$EXISTING" | jq -r '.[0].number') - echo " ℹ️ Reusing existing PR #${PR_NUMBER}" + echo " Reusing existing PR #${PR_NUMBER}" else # Create cascade PR PR_RESPONSE=$(curl -sS -w "\n%{http_code}" \ @@ -142,8 +142,8 @@ jobs: -H "Authorization: token ${GA_TOKEN}" \ -H "Content-Type: application/json" \ -d "{ - \"title\": \"chore: cascade main → ${BRANCH} (${SHORT_SHA}) [skip ci]\", - \"body\": \"## Automatic cascade\\n\\nForward-merging \`main\` (${SHORT_SHA}) into \`${BRANCH}\`.\\n\\nIf conflicts exist, resolve manually and merge.\\n\\n> Auto-created by **Cascade Main → Dev**.\", + \"title\": \"chore: cascade main -> ${BRANCH} (${SHORT_SHA}) [skip ci]\", + \"body\": \"## Automatic cascade\\n\\nForward-merging \`main\` (${SHORT_SHA}) into \`${BRANCH}\`.\\n\\nIf conflicts exist, resolve manually and merge.\\n\\n> Auto-created by **Cascade Main -> Dev**.\", \"head\": \"main\", \"base\": \"${BRANCH}\" }" \ @@ -155,12 +155,12 @@ jobs: if [ "$HTTP_CODE" != "201" ] || [ -z "$PR_NUMBER" ]; then MSG=$(echo "$BODY" | jq -r '.message // .' 2>/dev/null | head -1) - echo " ❌ Failed to create PR (HTTP ${HTTP_CODE}): ${MSG}" + echo " Failed to create PR (HTTP ${HTTP_CODE}): ${MSG}" FAILED=$((FAILED + 1)) continue fi - echo " ✅ Created PR #${PR_NUMBER}" + echo " Created PR #${PR_NUMBER}" fi # Try auto-merge @@ -171,7 +171,7 @@ jobs: MERGEABLE=$(echo "$PR_DATA" | jq -r '.mergeable // false') if [ "$MERGEABLE" != "true" ]; then - echo " ⚠️ Conflicts — PR #${PR_NUMBER} left open" + echo " Conflicts -- PR #${PR_NUMBER} left open" CONFLICTS=$((CONFLICTS + 1)) continue fi @@ -182,7 +182,7 @@ jobs: -H "Content-Type: application/json" \ -d "{ \"Do\": \"merge\", - \"merge_message_field\": \"chore: cascade main → ${BRANCH} [skip ci]\", + \"merge_message_field\": \"chore: cascade main -> ${BRANCH} [skip ci]\", \"delete_branch_after_merge\": false }" \ "${API}/pulls/${PR_NUMBER}/merge") @@ -190,23 +190,23 @@ jobs: MERGE_HTTP=$(echo "$MERGE_RESPONSE" | tail -1) if [ "$MERGE_HTTP" = "200" ] || [ "$MERGE_HTTP" = "204" ]; then - echo " ✅ Merged — ${BRANCH} is in sync" + echo " Merged -- ${BRANCH} is in sync" SUCCESS=$((SUCCESS + 1)) else MERGE_BODY=$(echo "$MERGE_RESPONSE" | sed '$d') - echo " ⚠️ Merge failed (HTTP ${MERGE_HTTP}) — PR #${PR_NUMBER} left open" + echo " Merge failed (HTTP ${MERGE_HTTP}) -- PR #${PR_NUMBER} left open" CONFLICTS=$((CONFLICTS + 1)) fi done # Summary echo "" - echo "════════════════════════════════════════" - echo " ✅ Merged: ${SUCCESS}" - echo " ⚠️ Conflicts: ${CONFLICTS}" - echo " ⏭️ Up to date: ${SKIPPED}" - echo " ❌ Failed: ${FAILED}" - echo "════════════════════════════════════════" + echo "" + echo " Merged: ${SUCCESS}" + echo " Conflicts: ${CONFLICTS}" + echo " Up to date: ${SKIPPED}" + echo " Failed: ${FAILED}" + echo "" if [ "$FAILED" -gt 0 ]; then exit 1 diff --git a/.mokogitea/workflows/ci-joomla.yml b/.mokogitea/workflows/ci-joomla.yml index 5c66f14..798585c 100644 --- a/.mokogitea/workflows/ci-joomla.yml +++ b/.mokogitea/workflows/ci-joomla.yml @@ -10,7 +10,7 @@ # REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/MokoStandards-API # PATH: /templates/workflows/joomla/ci-joomla.yml.template # VERSION: 04.06.00 -# BRIEF: CI workflow for Joomla extensions — lint, validate, test +# BRIEF: CI workflow for Joomla extensions -- lint, validate, test name: "Joomla: Extension CI" @@ -61,7 +61,7 @@ jobs: --prefer-dist \ --optimize-autoloader else - echo "No composer.json found — skipping dependency install" + echo "No composer.json found -- skipping dependency install" fi - name: PHP syntax check @@ -161,7 +161,7 @@ jobs: # Extract language file references from manifest LANG_FILES=$(grep -oP 'language\s+tag="[^"]*"[^>]*>\K[^<]+' "$MANIFEST" 2>/dev/null || true) if [ -z "$LANG_FILES" ]; then - echo "No language file references found in manifest — skipping." >> $GITHUB_STEP_SUMMARY + echo "No language file references found in manifest -- skipping." >> $GITHUB_STEP_SUMMARY else while IFS= read -r LANG_FILE; do LANG_FILE=$(echo "$LANG_FILE" | xargs) @@ -185,7 +185,7 @@ jobs: done <<< "$LANG_FILES" fi else - echo "No manifest found — skipping language check." >> $GITHUB_STEP_SUMMARY + echo "No manifest found -- skipping language check." >> $GITHUB_STEP_SUMMARY fi if [ "${ERRORS}" -gt 0 ]; then @@ -216,7 +216,7 @@ jobs: done if [ "${CHECKED}" -eq 0 ]; then - echo "No src/ or htdocs/ directories found — skipping." >> $GITHUB_STEP_SUMMARY + echo "No src/ or htdocs/ directories found -- skipping." >> $GITHUB_STEP_SUMMARY elif [ "${MISSING}" -gt 0 ]; then echo "" >> $GITHUB_STEP_SUMMARY echo "**${MISSING} director(ies) missing index.html out of ${CHECKED} checked.**" >> $GITHUB_STEP_SUMMARY @@ -354,7 +354,7 @@ jobs: --prefer-dist \ --optimize-autoloader else - echo "No composer.json found — skipping dependency install" + echo "No composer.json found -- skipping dependency install" fi - name: Run tests @@ -366,14 +366,14 @@ jobs: if [ $EXIT -eq 0 ]; then echo "All tests passed." >> $GITHUB_STEP_SUMMARY else - echo "Test failures detected — see log." >> $GITHUB_STEP_SUMMARY + echo "Test failures detected -- see log." >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY cat /tmp/test-output.log >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY fi exit $EXIT else - echo "No phpunit.xml found — skipping tests." >> $GITHUB_STEP_SUMMARY + echo "No phpunit.xml found -- skipping tests." >> $GITHUB_STEP_SUMMARY fi static-analysis: @@ -422,7 +422,7 @@ jobs: done if [ -z "$SRC_DIR" ]; then - echo "No source directory found (src/, htdocs/, lib/) — skipping." >> $GITHUB_STEP_SUMMARY + echo "No source directory found (src/, htdocs/, lib/) -- skipping." >> $GITHUB_STEP_SUMMARY exit 0 fi @@ -432,7 +432,7 @@ jobs: echo "Using project PHPStan config." >> $GITHUB_STEP_SUMMARY else ARGS="$ARGS --level=3" - echo "No phpstan.neon found — using level 3 (type inference)." >> $GITHUB_STEP_SUMMARY + echo "No phpstan.neon found -- using level 3 (type inference)." >> $GITHUB_STEP_SUMMARY fi $PHPSTAN $ARGS 2>&1 | tee /tmp/phpstan-output.txt diff --git a/.mokogitea/workflows/cleanup.yml b/.mokogitea/workflows/cleanup.yml index a890001..c8012c7 100644 --- a/.mokogitea/workflows/cleanup.yml +++ b/.mokogitea/workflows/cleanup.yml @@ -8,7 +8,7 @@ # REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform # PATH: /.gitea/workflows/cleanup.yml # VERSION: 01.00.00 -# BRIEF: Scheduled cleanup — delete merged branches and old workflow runs +# BRIEF: Scheduled cleanup -- delete merged branches and old workflow runs name: "Universal: Repository Cleanup" diff --git a/.mokogitea/workflows/gitleaks.yml b/.mokogitea/workflows/gitleaks.yml index e0fdd1d..6a672b8 100644 --- a/.mokogitea/workflows/gitleaks.yml +++ b/.mokogitea/workflows/gitleaks.yml @@ -8,7 +8,7 @@ # REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/moko-platform # PATH: /templates/workflows/gitleaks.yml.template # VERSION: 01.00.00 -# BRIEF: Secret scanning — detect leaked credentials, API keys, and tokens +# BRIEF: Secret scanning -- detect leaked credentials, API keys, and tokens # # +========================================================================+ # | SECRET SCANNING | @@ -89,7 +89,7 @@ jobs: run: | REPO="${{ github.event.repository.name }}" curl -sS \ - -H "Title: ${REPO} — secrets detected in code" \ + -H "Title: ${REPO} -- secrets detected in code" \ -H "Tags: rotating_light,key" \ -H "Priority: urgent" \ -d "Gitleaks found potential secrets. Review and rotate credentials immediately." \ diff --git a/.mokogitea/workflows/pr-check.yml b/.mokogitea/workflows/pr-check.yml index bc1a001..51362db 100644 --- a/.mokogitea/workflows/pr-check.yml +++ b/.mokogitea/workflows/pr-check.yml @@ -8,7 +8,7 @@ # REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/moko-platform # PATH: /templates/workflows/universal/pr-check.yml.template # VERSION: 05.00.00 -# BRIEF: PR gate — branch policy + code validation before merge +# BRIEF: PR gate -- branch policy + code validation before merge name: "Universal: PR Check" @@ -24,7 +24,7 @@ env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true jobs: - # ── Branch Policy ────────────────────────────────────────────────────── + # Branch Policy branch-policy: name: Branch Policy runs-on: ubuntu-latest @@ -34,7 +34,7 @@ jobs: HEAD="${{ github.head_ref }}" BASE="${{ github.base_ref }}" - echo "PR: ${HEAD} → ${BASE}" + echo "PR: ${HEAD} -> ${BASE}" ALLOWED=true REASON="" @@ -85,18 +85,18 @@ jobs: echo "${REASON}" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### Allowed merge paths:" >> $GITHUB_STEP_SUMMARY - echo "- \`feature/*\` → \`dev\`" >> $GITHUB_STEP_SUMMARY - echo "- \`fix/*\` → \`dev\`" >> $GITHUB_STEP_SUMMARY - echo "- \`hotfix/*\` → \`dev\` or \`main\`" >> $GITHUB_STEP_SUMMARY - echo "- \`dev\` → \`main\`" >> $GITHUB_STEP_SUMMARY - echo "- \`rc/*\` → \`main\`" >> $GITHUB_STEP_SUMMARY + echo "- \`feature/*\` -> \`dev\`" >> $GITHUB_STEP_SUMMARY + echo "- \`fix/*\` -> \`dev\`" >> $GITHUB_STEP_SUMMARY + echo "- \`hotfix/*\` -> \`dev\` or \`main\`" >> $GITHUB_STEP_SUMMARY + echo "- \`dev\` -> \`main\`" >> $GITHUB_STEP_SUMMARY + echo "- \`rc/*\` -> \`main\`" >> $GITHUB_STEP_SUMMARY exit 1 fi - echo "Branch policy: OK (${HEAD} → ${BASE})" + echo "Branch policy: OK (${HEAD} -> ${BASE})" echo "## Branch Policy: Passed" >> $GITHUB_STEP_SUMMARY - # ── Code Validation ──────────────────────────────────────────────────── + # Code Validation validate: name: Validate PR runs-on: ubuntu-latest @@ -162,7 +162,7 @@ jobs: echo "Dolibarr module: ${MOD_FILE}" ;; *) - echo "Generic platform — no manifest validation" + echo "Generic platform -- no manifest validation" ;; esac diff --git a/.mokogitea/workflows/pre-release.yml b/.mokogitea/workflows/pre-release.yml index 3ddd113..f2f9bd9 100644 --- a/.mokogitea/workflows/pre-release.yml +++ b/.mokogitea/workflows/pre-release.yml @@ -8,7 +8,7 @@ # REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /templates/workflows/universal/pre-release.yml.template # VERSION: 05.00.00 -# BRIEF: Manual pre-release — builds dev/alpha/beta/rc packages from any branch +# BRIEF: Manual pre-release -- builds dev/alpha/beta/rc packages from any branch name: "Universal: Pre-Release" @@ -86,7 +86,7 @@ jobs: MINOR=$(echo "$CURRENT" | cut -d. -f2) PATCH=$(echo "$CURRENT" | cut -d. -f3) - # Patch bump with rollover: ZZ=99 → bump minor, YY=99 → bump major + # Patch bump with rollover: ZZ=99 -> bump minor, YY=99 -> bump major NEW_PATCH=$((10#$PATCH + 1)) NEW_MINOR=$((10#$MINOR)) NEW_MAJOR=$((10#$MAJOR)) @@ -103,7 +103,7 @@ jobs: VERSION=$(printf "%02d.%02d.%02d" $NEW_MAJOR $NEW_MINOR $NEW_PATCH) TODAY=$(date +%Y-%m-%d) - echo "Bumping: ${CURRENT} → ${VERSION} (patch)" + echo "Bumping: ${CURRENT} -> ${VERSION} (patch)" # Update README.md sed -i "s/VERSION:[[:space:]]*${CURRENT}/VERSION: ${VERSION}/" README.md @@ -126,7 +126,7 @@ jobs: if [ -n "$SUB_VER" ]; then sed -i "s|${SUB_VER}|${VERSION}|" "$SUB_MANIFEST" sed -i "s|[^<]*|${TODAY}|" "$SUB_MANIFEST" - echo " Bumped sub-extension: $(basename $SUB_MANIFEST) ${SUB_VER} → ${VERSION}" + echo " Bumped sub-extension: $(basename $SUB_MANIFEST) ${SUB_VER} -> ${VERSION}" fi done fi @@ -145,7 +145,7 @@ jobs: git remote set-url origin "https://jmiller:${{ secrets.GA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git" git add -A git diff --cached --quiet || { - git commit -m "chore(version): bump ${CURRENT} → ${VERSION} [skip ci]" + git commit -m "chore(version): bump ${CURRENT} -> ${VERSION} [skip ci]" git push origin HEAD 2>&1 } @@ -317,7 +317,7 @@ jobs: DATE=$(date +%Y-%m-%d) if [ ! -f "updates.xml" ]; then - echo "No updates.xml — skipping" + echo "No updates.xml -- skipping" exit 0 fi @@ -384,7 +384,7 @@ jobs: for BRANCH in main dev; do [ "$BRANCH" = "$CURRENT_BRANCH" ] && continue - echo "Syncing updates.xml → ${BRANCH}" + echo "Syncing updates.xml -> ${BRANCH}" git fetch origin "${BRANCH}" 2>/dev/null || continue git checkout "origin/${BRANCH}" -- . 2>/dev/null || continue git checkout "${CURRENT_BRANCH}" -- updates.xml @@ -403,7 +403,7 @@ jobs: TOKEN="${{ secrets.GA_TOKEN }}" STABILITY="${{ steps.meta.outputs.stability }}" - # Cascade: rc → beta,alpha,dev | beta → alpha,dev | alpha → dev | dev → nothing + # Cascade: rc -> beta,alpha,dev | beta -> alpha,dev | alpha -> dev | dev -> nothing case "$STABILITY" in release-candidate) TAGS_TO_DELETE="beta alpha development" ;; beta) TAGS_TO_DELETE="alpha development" ;; diff --git a/.mokogitea/workflows/repo-health.yml b/.mokogitea/workflows/repo-health.yml index f091d5d..e272757 100644 --- a/.mokogitea/workflows/repo-health.yml +++ b/.mokogitea/workflows/repo-health.yml @@ -54,7 +54,7 @@ env: REPO_DISALLOWED_DIRS: REPO_DISALLOWED_FILES: TODO.md,todo.md - # Wiki-preferred documentation — wiki is full credit, repo file is advisory + # Wiki-preferred documentation -- wiki is full credit, repo file is advisory # Format: filename:WikiPageName (Gitea wiki page slug) WIKI_PREFERRED_DOCS: CONTRIBUTING.md:Contributing,CODE_OF_CONDUCT.md:Code-of-Conduct,GOVERNANCE.md:Governance @@ -94,7 +94,7 @@ jobs: PERMISSION=unknown METHOD="" - # Hardcoded authorized users — always allowed + # Hardcoded authorized users -- always allowed case "$ACTOR" in jmiller|gitea-actions[bot]) ALLOWED=true @@ -558,7 +558,7 @@ jobs: [ -f "${file}" ] && file_exists=true if [ "${wiki_exists}" = true ]; then - wiki_ok+=("${file} → wiki/${page}") + wiki_ok+=("${file} -> wiki/${page}") elif [ "${file_exists}" = true ]; then wiki_file_fallback+=("${file}") content_warnings+=("${file} found in repo root (preferred location: wiki/${page})") @@ -574,11 +574,11 @@ jobs: printf '%s\n' '|---|---|---|' for item in "${wiki_ok[@]:-}"; do [ -z "${item}" ] && continue - printf '%s\n' "| ${item%%→*}| Wiki | OK |" + printf '%s\n' "| ${item%%->*}| Wiki | OK |" done for item in "${wiki_file_fallback[@]:-}"; do [ -z "${item}" ] && continue - printf '%s\n' "| ${item} | Repo file | Advisory — migrate to wiki |" + printf '%s\n' "| ${item} | Repo file | Advisory -- migrate to wiki |" done for item in "${wiki_missing[@]:-}"; do [ -z "${item}" ] && continue -- 2.52.0