Release update downstream packages
Skill tony/ai-workflow-plugins/.agents/skills/release-update-downstream-packages
Roll a newly published package release out to every consumer repo you maintain — discover consumers under your workspace roots, bump pins, re-lock, commit, push, and verify CI with gh.From its SKILL.md
npx -y skills add tony/ai-workflow-plugins --skill release-update-downstream-packagesAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
7.8 KB, ~1.9k tokens by cl100k_base, as published. Nobody here has run it
Update Downstream Packages
A release of one of the user's packages just published. Find every repo of theirs that consumes it, bump the pin (and sibling workspace packages released together with it), refresh lockfiles, commit, push to trunk, and verify CI end to end.
Arguments: $ARGUMENTS
This command pushes to trunk of many repos. Nothing is mutated
before the Phase 3 confirmation gate. --no-push runs the whole
procedure but leaves commits local.
Phase 1: Inputs and Pre-flight
- Package — the first non-flag argument. If missing, ask.
- Version — the second non-flag argument, or discover the latest
published version from the package index (for PyPI:
https://pypi.org/pypi/<package>/json; for npm:npm view <package> version). Confirm the version actually exists on the index before touching anything — locking against an unpublished version fails everywhere at once. - Workspace roots — from
--rootsglobs. If not given, ask the user which directories hold their open-source checkouts (e.g. glob patterns two levels deep under a work directory). Do not assume a layout. - Sibling packages — if the package is developed in a workspace
repo that publishes several packages versioned together, list the
siblings (from the source repo's
packages/*manifests or the index). They bump together. - Fresh resolver cache — for Python consumers, run
uv cache clean --forceonce before any locking, so every lock resolves against the newly published files rather than a stale cached index.
Phase 2: Discover Consumers
Scan the workspace roots for repos whose manifest depends on the package:
rg -l '<package>' <root>/*/pyproject.toml <root>/*/package.json
For each hit, record:
- Worktree? If
.gitis a file rather than a directory, it is a linked worktree — skip it; the primary checkout will be found on its own. - Trunk —
git symbolic-ref refs/remotes/origin/HEAD, falling back to whichever ofmain/masterexists. - Owner — from
git remote get-url origin. Group repos by owner org; the user confirms which orgs are in scope at the gate. - Current pin(s) — the pinned version(s) of the package and any siblings in the manifest.
- Source overrides — dependency sources that shadow the index
(
[tool.uv.sources]entries, npmfile:/link:/git:specs). These repos need the override removed and the published index package used instead — as its own commit, before the bump. - Resolver cutoffs — for uv consumers, whether
[tool.uv.exclude-newer]is set and whether the package and every sibling appear under[tool.uv.exclude-newer-package]. A missing entry blocks the fresh release at lock time; add the missing entries as their own commit, before the bump. - Dirty? Repos with uncommitted changes get reported and skipped unless the user says otherwise.
Phase 3: Confirmation Gate (mandatory)
Present the plan before mutating anything:
- Per repo: path, owner, branch to update, current pin → new version,
and any prep commits needed (source-override removal,
exclude-newer-packageadditions). - Skipped repos with reasons (worktree, dirty, org out of scope).
- Whether pushes will happen (
--no-pushinverts the default).
Ask the user to confirm scope via ask-user-choice — which owner
orgs are in scope, and whether any repo needs a branch override or an
additional branch beyond trunk (some projects maintain a
long-lived second branch that also consumes the package; the user
names it, the same per-repo procedure runs on it). Do not proceed
without confirmation.
Phase 4: Per-Repo Procedure
Repos are independent — parallelize with background agents batched by owner org (up to 4 batches), or run sequentially if agents are unavailable. Each repo, on each of its confirmed branches:
-
Sync —
git checkout <branch> && git pull --ff-only. -
Prep commits (each on its own, only if discovery flagged it):
- Remove the source override so the repo consumes the published
index package. Commit it alone, e.g.
py(deps[docs]) Use published <package> from PyPIwith a why/what body. - Add missing entries to
[tool.uv.exclude-newer-package](<name> = false, alphabetical order). Commit alone; wrapexclude-newer-packagein backticks in the subject:py(deps[uv]) Add <name> to `exclude-newer-package` whitelistwith a why/what body noting the cooldown would otherwise block the fresh release.
- Remove the source override so the repo consumes the published
index package. Commit it alone, e.g.
-
Bump pins — replace the pinned version for the package and all siblings in the manifest. A pattern replacement across the shared version series catches every sibling at once, e.g.:
sed -i 's/==0\.0\.1a[0-9]\+/==0.0.1a<N>/g' pyproject.toml -
Re-lock — the ecosystem's lock command (
uv lock,npm install --package-lock-only, ...). On a resolution failure,uv cache clean --forceand retry once. -
Prerelease warnings mean stop. If locking warns about prerelease resolution or would need
--prereleaseflags or config to accept the version, do not add flags, pins, or config to force it through — halt this repo and report. A correctly published release resolves without coaxing; a warning means something upstream is wrong (stale cache, missingexclude-newer-packageentry, or a bad publish). -
Commit — mirror the repo's own previous bump commits for this package (
git log --oneline --grep '<package>'). Fallback subject, version-arrow form:py(deps[docs]) <package> <old> → <new>Body: why/what summarizing what the new release ships — read the package's CHANGES entry for the version, do not invent.
-
Push —
git push(skip with--no-push). Never force.
Phase 5: Verify with gh
For every pushed repo:
-
Clear stale Actions caches so CI resolves fresh:
gh cache delete --all --repo <owner>/<repo> -
Watch the run for the pushed commit:
gh run list --repo <owner>/<repo> --branch <branch> --limit 1 -
On failure: clear the cache again and
gh run rerun <run-id> --failed. If it still fails, compare with the run before the bump — a pre-existing failure is reported as such, not retried forever. -
Where the repo deploys docs from CI, confirm the docs job/workflow succeeded too — a docs-dependency bump that breaks the docs build defeats the point.
Output
- Hero line:
✓ <package> <old> → <new> across N repos(or⚠with the failure count). - Rollout summary — per repo: branch, prep commits, bump commit, pushed or local, CI status.
- Stopped repos — any halted on prerelease warnings, dirty trees, or persistent CI failures, each with what the user should look at.
- Next-step
ask-user-choicepanel: rerun failed CI checks / retry stopped repos / push the--no-pushcommits / done.
Portability notes
ask-user-choice— present the listed options and wait for the user to pick one. Hosts with a structured multiple-choice tool (Claude Code'sAskUserQuestion) should use it; otherwise print a numbered list and wait for a numbered reply. Never proceed on an assumed answer.$ARGUMENTS— the text the user passed when invoking this skill. If your host does not substitute it, read it as the user's request in the current turn, and ask when there is none.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most ship operate skills give in ~1.9k tokens
Counted across 779 of the 1,178 authors here whose files we hold, read 2026-08-07
- Document a rollback plan before deploymentin 41 of 779, across 22 files
- Update the changelogin 21 of 779, across 19 files
- Run the test suitein 20 of 779
- Create an annotated git tagin 20 of 779
- Clean up feature flags after full rolloutin 18 of 779, across 10 files
- Verify deployment health after launchin 18 of 779, across 10 files
- Test both feature flag statesin 17 of 779, across 9 files
- Verify the working tree is cleanin 17 of 779
- Make database migrations backward-compatiblein 16 of 779, across 8 files
- Set up error monitoring before launchin 15 of 779, across 7 files
- Monitor metrics at each rollout stagein 14 of 779, across 5 files
- Create a GitHub releasein 14 of 779
Said here and by no other author read
- confirm package version exists on index
- clean resolver cache before locking
- skip linked worktrees
- remove source overrides before bumping
- present plan before mutating anything
- sync branch before bumping
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.