From 6f0eb8e9bc446ffcd5831f18ceed669c19dd645a Mon Sep 17 00:00:00 2001 From: Markus Waldheim Date: Mon, 10 Aug 2026 10:32:23 +0200 Subject: [PATCH 1/4] feat(sync): continuously reconcile plugin standards Run template reconciliation on workflow changes and daily, create unique per-commit sync branches, and enable managed workflow synchronization by default. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Markus Waldheim --- .github/workflows/sync-template.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/sync-template.yml b/.github/workflows/sync-template.yml index 7eefdbe..ae3f720 100644 --- a/.github/workflows/sync-template.yml +++ b/.github/workflows/sync-template.yml @@ -11,6 +11,12 @@ on: - GOVERNANCE.md - SECURITY.md - MAINTAINERS.md + - .github/workflows/ci.yml + - .github/workflows/release.yml + - .github/workflows/security.yml + - .github/workflows/sync-template.yml + schedule: + - cron: "17 3 * * *" workflow_dispatch: inputs: dry_run: @@ -20,7 +26,7 @@ on: include_workflows: description: Also sync .github/workflows/ files (requires SYNC_TOKEN with workflow scope - PAT from github.com/settings/tokens with repo+workflow scopes) type: boolean - default: false + default: true permissions: contents: read @@ -82,7 +88,7 @@ jobs: - name: Apply template files env: PLUGIN: ${{ matrix.plugin }} - INCLUDE_WORKFLOWS: ${{ inputs.include_workflows || 'false' }} + INCLUDE_WORKFLOWS: ${{ github.event_name == 'push' || github.event_name == 'schedule' || inputs.include_workflows }} shell: bash run: | set -euo pipefail @@ -131,7 +137,7 @@ jobs: exit 0 fi SHORT_SHA="${COMMIT_SHA:0:7}" - BRANCH="chore/sync-template-$(date +%Y%m%d)" + BRANCH="chore/sync-template-${SHORT_SHA}" if git ls-remote --exit-code origin "refs/heads/$BRANCH" > /dev/null 2>&1; then echo "Branch $BRANCH already exists - skipping" exit 0 From afc051e65beaef2408243e1db7eeb1c83cdea6f4 Mon Sep 17 00:00:00 2001 From: Markus Waldheim Date: Mon, 10 Aug 2026 10:32:51 +0200 Subject: [PATCH 2/4] fix(sync): cover the complete plugin matrix Include publisher, packager, and newer condition, hook, and updater repositories in continuous standard reconciliation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Markus Waldheim --- .github/workflows/sync-template.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/sync-template.yml b/.github/workflows/sync-template.yml index ae3f720..0b64020 100644 --- a/.github/workflows/sync-template.yml +++ b/.github/workflows/sync-template.yml @@ -43,6 +43,8 @@ jobs: - analyzer-conventional - analyzer-default - condition-generic + - condition-bitbucket-pipelines + - condition-circleci - condition-gitea-actions - condition-github-actions - condition-gitlab-ci @@ -50,6 +52,7 @@ jobs: - generator-changelog-md - generator-release-notes - hook-email + - hook-discord - hook-gitplugin - hook-jira - hook-matrix @@ -60,7 +63,14 @@ jobs: - provider-gitea - provider-github - provider-gitlab + - publisher-crates + - publisher-generic-http + - publisher-npm + - publisher-oci + - publisher-pypi + - packager-nfpm - updater-cargo + - updater-composer - updater-docker - updater-go - updater-gradle @@ -70,6 +80,7 @@ jobs: - updater-npm - updater-nuget - updater-python + - updater-pubspec - updater-terraform steps: From fcff74f1738898693f29196c1fd70fb4315dc50a Mon Sep 17 00:00:00 2001 From: Markus Waldheim Date: Mon, 10 Aug 2026 10:33:10 +0200 Subject: [PATCH 3/4] fix(sync): create missing managed files Ensure every plugin receives the complete managed standard set while keeping the plugin-specific semrel-release workflow as an explicit overlay. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Markus Waldheim --- .github/workflows/sync-template.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/sync-template.yml b/.github/workflows/sync-template.yml index 0b64020..e016630 100644 --- a/.github/workflows/sync-template.yml +++ b/.github/workflows/sync-template.yml @@ -103,22 +103,24 @@ jobs: shell: bash run: | set -euo pipefail + mkdir -p plugin/.github/workflows for f in CODE_OF_CONDUCT.md CONTRIBUTING.md; do - if [ -f "template/$f" ] && [ -f "plugin/$f" ]; then + if [ -f "template/$f" ]; then sed "s/{{PROJECT_NAME}}/$PLUGIN/g; s/{{DEFAULT_BRANCH}}/main/g" "template/$f" > "plugin/$f" fi done for f in Makefile GOVERNANCE.md SECURITY.md MAINTAINERS.md; do - if [ -f "template/$f" ] && [ -f "plugin/$f" ]; then + if [ -f "template/$f" ]; then cp "template/$f" "plugin/$f" fi done - if [ -f "template/Dockerfile" ] && [ -f "plugin/Dockerfile" ]; then + if [ -f "template/Dockerfile" ]; then sed "s/plugin-template Authors/$PLUGIN Authors/" "template/Dockerfile" > "plugin/Dockerfile" fi if [ "$INCLUDE_WORKFLOWS" = "true" ]; then + # semrel-release.yaml is a plugin-specific overlay and is not managed here. for wf in ci.yml release.yml security.yml; do - if [ -f "template/.github/workflows/$wf" ] && [ -f "plugin/.github/workflows/$wf" ]; then + if [ -f "template/.github/workflows/$wf" ]; then cp "template/.github/workflows/$wf" "plugin/.github/workflows/$wf" fi done From fba56639fb09352208984fd2becb9aa079c05339 Mon Sep 17 00:00:00 2001 From: Markus Waldheim Date: Mon, 10 Aug 2026 10:38:10 +0200 Subject: [PATCH 4/4] feat(sync): discover plugins from the organization Build the sync matrix from active SemRels repositories using the established plugin category prefixes so new plugins are included automatically. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Markus Waldheim --- .github/workflows/sync-template.yml | 74 ++++++++++++----------------- 1 file changed, 31 insertions(+), 43 deletions(-) diff --git a/.github/workflows/sync-template.yml b/.github/workflows/sync-template.yml index e016630..9bd0d33 100644 --- a/.github/workflows/sync-template.yml +++ b/.github/workflows/sync-template.yml @@ -32,56 +32,44 @@ permissions: contents: read jobs: + discover: + name: Discover plugins + runs-on: ubuntu-latest + permissions: + contents: read + outputs: + plugins: ${{ steps.discover.outputs.plugins }} + steps: + - name: Discover plugin repositories + id: discover + env: + GH_TOKEN: ${{ secrets.SYNC_TOKEN }} + ORG: ${{ github.repository_owner }} + shell: bash + run: | + set -euo pipefail + plugins="$( + gh api --paginate "orgs/${ORG}/repos?per_page=100&type=all" \ + --jq '.[] | select(.archived == false and .fork == false and + (.name | test("^(analyzer|condition|generator|hook|packager|provider|publisher|updater)-"))) | .name' | + jq -R -s -c 'split("\n") | map(select(length > 0)) | sort | unique' + )" + if [ "$plugins" = "[]" ]; then + echo "No plugin repositories were discovered." >&2 + exit 1 + fi + echo "Discovered plugins: $plugins" + printf 'plugins=%s\n' "$plugins" >> "$GITHUB_OUTPUT" + sync: name: "Sync ${{ matrix.plugin }}" runs-on: ubuntu-latest + needs: discover strategy: fail-fast: false max-parallel: 8 matrix: - plugin: - - analyzer-conventional - - analyzer-default - - condition-generic - - condition-bitbucket-pipelines - - condition-circleci - - condition-gitea-actions - - condition-github-actions - - condition-gitlab-ci - - generator-changelog-html - - generator-changelog-md - - generator-release-notes - - hook-email - - hook-discord - - hook-gitplugin - - hook-jira - - hook-matrix - - hook-slack - - hook-teams - - provider-bitbucket - - provider-git - - provider-gitea - - provider-github - - provider-gitlab - - publisher-crates - - publisher-generic-http - - publisher-npm - - publisher-oci - - publisher-pypi - - packager-nfpm - - updater-cargo - - updater-composer - - updater-docker - - updater-go - - updater-gradle - - updater-helm - - updater-homebrew - - updater-maven - - updater-npm - - updater-nuget - - updater-python - - updater-pubspec - - updater-terraform + plugin: ${{ fromJSON(needs.discover.outputs.plugins) }} steps: - name: Check out template