Apply the changes from all open Renovate bot pull requests of a GitHub repository into the local working tree. Use this skill when asked to apply, merge locally, consolidate, batch, or try out Renovate/dependabot-style dependency update PRs so the combined upgrade can be built and tested in one go. This skill only modifies local files; it never commits, pushes, merges, or closes anything on GitHub.
71
86%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Collect every open pull request raised by Renovate in the target GitHub repository and apply their changes to the local working tree, so all dependency upgrades can be built and tested together.
git commit, git push, git merge, git cherry-pick,
git rebase, gh pr merge, gh pr close, or gh pr review.gh commands only
(gh pr list, gh pr view, gh pr diff, gh api GET).gh auth status
git rev-parse --show-toplevel
git status --short --branchgh is missing or unauthenticated, stop and tell the user.git rev-parse HEAD in the final report, so
the user can undo with git checkout -- . / git stash.git fetch originDetermine the repository: use the origin remote of the current directory by
default, or the owner/repo the user names (pass it as -R owner/repo to every
gh command).
gh pr list --app renovate --state open --limit 100 \
--json number,title,headRefName,isDraft,mergeable,files,labels,urlIf that returns nothing, Renovate may be running as a user account or a self-hosted app, so fall back to:
gh pr list --state open --limit 100 \
--json number,title,headRefName,author,isDraft,url \
--jq '[.[] | select((.author.login | test("renovate"; "i")) or (.headRefName | startswith("renovate/")))]'Notes:
Show the list to the user before applying, then proceed.
Apply in an order that minimises conflicts:
renovate/all-minor-patch) before the single-dependency PRs they may overlap with.Read each version bump from the PR title (Renovate titles are of the form
chore(deps): update dependency org.foo:bar to v1.2.3) and keep a running
table of PR number → package → old version → new version.
For every PR, take the patch and apply it with a three-way merge:
gh pr diff <number> --patch > /tmp/renovate-<number>.patch
git apply --3way --whitespace=nowarn /tmp/renovate-<number>.patchThen unstage what --3way staged, keeping the file contents, so the review
diff stays readable:
git reset --quietSkip the git reset if the user chose to continue on top of pre-existing
staged changes — it would unstage those too. In that case, note in the report
that the applied changes are staged.
Handle the outcomes:
git apply --3way writes <<<<<<< into the file):
resolve them by hand. For dependency files the resolution is almost always
"keep both bumps" — take the higher version for each distinct dependency, and
never leave a marker behind. Verify with
git grep -n '^<<<<<<<\|^>>>>>>>'.error: patch does not apply): do not force
it. Instead read the PR diff (gh pr diff <number>) and make the equivalent
edit directly in the manifest — change the version coordinate to the target
version from the PR title. This is the reliable path for generated lockfiles
and for PRs whose base is stale.package-lock.json, pnpm-lock.yaml, yarn.lock,
gradle.lockfile, uv.lock, poetry.lock, go.sum, …): applied lockfile
hunks from several PRs are frequently inconsistent. Prefer applying only the
manifest changes and regenerating each lockfile once, in step 6.Also apply Renovate PRs that touch non-code manifests — Dockerfile,
docker-compose.yml, .github/workflows/*.yml, .tool-versions,
.sdkmanrc, renovate.json — the same way.
After applying a wrapper or Docker image PR, work through the matching entry in step 5 before moving on.
Renovate only updates the files its managers know about. Some repositories duplicate the same version elsewhere, so after applying a PR check for these companion edits and make them by hand.
.sdkmanrcRenovate updates .mvn/wrapper/maven-wrapper.properties or
gradle/wrapper/gradle-wrapper.properties, but it does not update
.sdkmanrc, so the SDKMAN-pinned build tool stays behind.
grep -n distributionUrl .mvn/wrapper/maven-wrapper.properties \
gradle/wrapper/gradle-wrapper.properties 2>/dev/null
cat .sdkmanrc 2>/dev/nulldistributionUrl
(apache-maven-3.9.11-bin.zip → 3.9.11, gradle-9.1.0-bin.zip → 9.1.0)
and set the matching maven= / gradle= line in .sdkmanrc to it.java= alone unless a PR
actually changed the project's Java version.java=25-tem, not a bare
25). If unsure the exact version is published, check sdk list maven /
sdk list gradle; if it is not available yet, leave .sdkmanrc untouched
and report it.gradle-wrapper.jar). gh pr diff --patch includes those, but if git apply rejects the binary hunk, take the
file from the PR head instead:git fetch origin pull/<number>/head
git checkout FETCH_HEAD -- gradle/wrapper/gradle-wrapper.jar
git reset --quietIf the repository has no .sdkmanrc, do not create one.
TestcontainersConfigRenovate bumps image tags in Dockerfile, compose.yaml/docker-compose.yml
and Kubernetes manifests, but image tags hardcoded in Java/Kotlin test
configuration are invisible to it. Update the shared Testcontainers
configuration class to the same tags.
git grep -ln "TestcontainersConfig" -- '*.java' '*.kt'
# root module and, for multi-module builds, every nested module
git grep -nE '"[a-z0-9][a-z0-9._/-]*:[a-zA-Z0-9][a-zA-Z0-9._-]*"' -- \
'src/test/**/*.java' 'src/test/**/*.kt' \
'**/src/test/**/*.java' '**/src/test/**/*.kt'Typical declarations to update:
static GenericContainer<?> mailhog = new GenericContainer<>("mailhog/mailhog:v1.0.1");
PostgreSQLContainer postgres = new PostgreSQLContainer("postgres:18-alpine");
GenericContainer<?> redis = new GenericContainer<>(DockerImageName.parse("redis:7-alpine"));Rules:
postgres:18-alpine and the PR
moves compose to postgres:19, write postgres:19-alpine — do not drop the
-alpine/-jammy/-slim suffix or invent one the registry lacks.DockerImageName.parse(...).asCompatibleSubstituteFor(...),
withExposedPorts(...), and withDatabaseName(...) exactly as they are.libs.versions.toml, a
DockerImages-style holder, or a test property, update it at that single
source instead of at each usage.*IT/*Tests classes with their own GenericContainer,
src/test/resources/** compose files, application-test.properties, and
testcontainers.properties.These edits are only validated by running the tests, so make sure step 7 runs the integration tests, not just compilation.
If the repository would benefit from Renovate tracking these files directly,
mention a customManagers regex manager as a follow-up suggestion in the
report — do not edit renovate.json unless the user asks.
After all PRs are applied, regenerate lockfiles/derived files a single time using the project's own tooling. Pick the commands that match the repository:
| Ecosystem | Command |
|---|---|
| Maven | ./mvnw -q -DskipTests verify (no lockfile; this validates resolution) |
| Gradle | ./gradlew dependencies --write-locks (only if lockfiles are used) |
| npm | npm install --package-lock-only |
| pnpm | pnpm install --lockfile-only |
| yarn | yarn install --mode update-lockfile |
| uv | uv lock |
| Poetry | poetry lock --no-update |
| Go | go mod tidy |
Use the wrapper scripts (./mvnw, ./gradlew) when present. If a command
needs network access that is unavailable, say so instead of hand-editing a
lockfile.
Run the project's build and tests, preferring an existing task runner
(Taskfile.yml, Makefile, package.json scripts):
./mvnw verify # or ./gradlew build, npm test, task test, ...If the build breaks:
gh pr view <number> renders the body
Renovate writes, including breaking changes.git checkout -- <paths> for files only that PR touched) and report it as
skipped with the reason.Never make a test pass by weakening or deleting an assertion.
Finish with a summary that contains:
applied, applied with manual resolution, applied manually, skipped)..sdkmanrc, TestcontainersConfig, other
hardcoded image tags), and any that were needed but could not be made.git status --short).git diff # review everything applied
git checkout -- . # discard all applied changes031ea5c
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.