Repository navigation
Propagate template updates to plugin repositories - #5
Merged
Merged
Conversation
astrojuanlu
added a commit
to obs-plugins-snaps/meta
that referenced
this pull request
Oct 22, 2026
The proposal from the discussion now lives as an architecture decision record (docs/adr/0001-template-propagation.md): meta plugins/ as the source of truth for the plugin list, a single propagate workflow in the template repository, copier update three-way merges, idempotency and per-run summaries, and the bot App permission requirements. The implementation itself is in obs-plugins-snaps/template#5. Also add a Records and decisions section to the README pointing at the plugin records and the ADR directory. Assisted-by: OpenRouter:z-ai/glm-5.3-flash pi
astrojuanlu
force-pushed
the
propagate
branch
3 times, most recently
from
October 22, 2026 10:37
ca71a02 to
1f5d5f8
Compare
astrojuanlu
force-pushed
the
propagate
branch
from
October 22, 2026 13:27
1f5d5f8 to
23d9585
Compare
New propagate.yaml workflow (plus the stdlib driver it calls): after the auto-tag workflow runs on main, read the managed plugin list from meta/plugins (the single source of truth), and for every <plugin>-obs-studio-snap repository whose .copier-answers.yml records an older template commit, run copier update --defaults --vcs-ref <tag> and open a template-update PR. Idempotent via existing branches and open PRs; per-plugin results land in the run summary. Commits are authored by the obs-plugins-snaps-bot machine user and signed with the CI_SSH_SIGNING_KEY repo secret (SSH key registered as a signing key on that account), so they show as Verified. Assisted-by: OpenRouter:z-ai/glm-5.3-flash pi
astrojuanlu
force-pushed
the
propagate
branch
from
October 22, 2026 13:32
23d9585 to
e091315
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Propagates template updates to the plugin repositories automatically.
Why
Plugin repos are generated from this template via Copier and record the template version in
.copier-answers.yml. The template auto-tags every merge to main, so scaffolding improvements (issue templates, CI workflows, README wording) are immediately available as a tag — but without automation, propagating one means manually opening a PR per plugin repo: repetitive and easily forgotten, letting repos drift apart.Design
plugins/is the source of truth for the plugin list. The workflow reads the directory listing via the API at runtime; every<plugin_name>-obs-studio.jsonrecord maps to<plugin_name>-obs-studio-snap. Rejected alternative: an org API repo listing (would match non-plugin repos and duplicate knowledge already in meta).propagate.yaml+ stdlib-only driver). Triggered byworkflow_runafter the auto-tag workflow, plusworkflow_dispatchwith an explicit tag for manual runs. Rejected alternative: per-repo dispatcher workflows (more moving parts).copier update(three-way merge), not re-render. Plugin repos carry hand-tuned build recipes that must survive updates; conflicts surface in the PRs for human resolution..copier-answers.yml), skips existingtemplate-update-<tag>branches/PRs, reports record-without-repo as skip (not fail), and writes a per-plugin summary table to the run summary.obs-plugins-snaps-botmachine user (noreply email matches the account holding the SSH signing key, registered as a signing key) and signed with theCI_SSH_SIGNING_KEYrepo secret, so they show as Verified. PRs are opened by the App.contents: write,pull_requests: write,workflows: write(the latter because template updates modify.github/workflows/*files, which GitHub gates separately);templatecarries theAPP_CLIENT_IDvariable,APP_PRIVATE_KEYandCI_SSH_SIGNING_KEYsecrets.What this PR contains
.github/workflows/propagate.yaml— the workflow described above: resolve latestv*tag → list plugin records in meta → per repo: skip guards →copier update --defaults --vcs-ref <tag>→ commit (signed, authored by the machine user) → push branch → open PR with a body listing the template commits and files in range, plus the repo-level diffstat of what actually got rendered..github/scripts/propagate.py— stdlib-only driver (urllib, subprocess, tempfile; no extra CI deps): per-plugin error isolation, template-change summary via the compare API, repo diffstat, PR creation,$GITHUB_STEP_SUMMARYtable (skipped / updated / missing repo / failed).pyproject.toml— ruff per-file ignores for the shipped driver.Verification done locally
copier update --defaults --vcs-ref v0.0.6on a fresh clone of source-record-obs-studio-snap: clean three-way update (.copier-answers.yml→ v0.0.6, newbug.yml)ruff check+ruff format --checkclean; pytest 26 passedFirst run
After merge, trigger via Actions → Propagate template updates → Run workflow with tag
v0.0.6(theworkflow_runtrigger only fires on the next tag). Expected: 4 update PRs (source-record, distroav, ndi-runtime, advanced-scene-switcher), each containing the v0.0.6 scaffolding plus the.copier-answers.ymlbump.Assisted-by: OpenRouter:z-ai/glm-5.3-flash pi