dependency-updates
Esposter dependency update process — all versions in pnpm-workspace.yaml catalog, caret prefix rules, pinned packages (nuxt, h3, ctix), and tracked open issues. Apply when updating package versions.
SKILL.md.claude/skills/dependency-updates/SKILL.md
GitHubDependency Updates
All version numbers live in the catalog: section of pnpm-workspace.yaml at the repo root. Individual package.json files reference them with catalog: — never edit version numbers there.
Renovate writes versions; people write policy. Every version the repo declares is reached by Renovate — the catalog and overrides:, .node-version, packageManager, every action under .github/, every FROM — and a minor or patch merges on green without a person in the loop, and a major waits for one. A pnpm bump is neither: the hand pass always takes it (the Settled list on this page). The one version outside the bot is the Functions host's node major in apps/infra, capped by what the runtime supports and moved by hand (the pulumi-infra skill's Settled list). What a person owns is renovate.json's packageRules: every cap, disable, group and read-before-merge is one rule there with a description that is the reason, and pnpm outdated:dependencies reads the same rules, so a version the bot would not propose is listed as held rather than as a bump to take. Policy written anywhere else — a range trick in the catalog, a note in this skill alone — is policy the bot cannot read. Which rules exist and what each manager reaches is references/renovate.md.
Settled — do not re-propose
- Holding a pnpm bump for a person. A pnpm bump is always taken by the hand pass, its features audit in the commit body, never left as a PR that waits for a read; the rule that held it was reversed on 2026-10-18.
- Switching off what a major turns on by default to keep the bump behaviour-preserving. New defaults are adopted; only a breakage the audit found earns an opt-out (
references/major-upgrades.md§3). - A confirmation gate before
pnpm refresh:lockfile(step 3 ofreferences/bumping-by-hand.md). Its process kill is the precondition the delete needs on Windows, everything it ends is a restartable process of this repo's own, and a pass runs unattended — a gate turns it into one that stops to ask a question whose answer is yes. The trade is written at that step, and a review finding asking for the gate is answered with this line. - Raising
minimumReleaseAgeabove0, in pnpm or Renovate. Being on the freshest version is the point, and a quarantine turns one clean pass into a partial one (references/renovate.md). - Lifting or lowering
:prConcurrentLimit10, or honouring:prHourlyLimit2. The hourly limit only delays a decided bump; ten branches in flight bounds one run against the shared runners (references/renovate.md). - Splitting a hand pass into one commit per major. A pass is one commit whose body carries a section per major; the split bought a per-package revert this repo never performs and cost a hand-reconciled lockfile per commit (
references/major-upgrades.md§5).
Rules
- A bump ahead of the bot takes Renovate's path —
pnpm outdated:dependencies, the catalog edit keeping its^,pnpm refresh:lockfile, and the outdated check again until it passes (references/bumping-by-hand.md). - A major — a red row in
pnpm outdated:dependencies, or the PR Renovate opens because it never automerges one — owes an audit whose record is the commit body: the notes read from the tag, every breaking bullet answered by a grep, every release in between read, and the features weighed against what the repo hand-rolled in their absence (references/major-upgrades.md). - A pnpm bump of any size is taken by the hand pass, and owes the features half of that audit in its commit body (
references/pnpm-bumps.md). - A GitHub Action is pinned to the tag's dereferenced commit SHA —
uses: <owner>/<action>@<commit-sha> # v<version>, never the annotated tag object, which Actions cannot resolve (references/github-actions.md). .node-versionis the one node pin, never hand-edited; every node floor a manifest declares (engines.node,devEngines.runtime, a plugin's own included) is>=that pin and moves with it throughpnpm update:node [version], never by hand, and so does the root entry of apackage-lock.jsonbeside one (thefile-organizationskill,references/new-package.md). Renovate'snodegroup bumps the pin with@types/node(references/updating-node.md).- A bump owes what it moves beyond the version — the
@TODOs linking the package, the PGlite and UnoCSS snapshots,inlinedDependenciesand the bundle sizes (references/bump-follow-through.md). - A hold is a
packageRulesentry naming the packages exactly, its reason thedescription, paired with the catalog range that stops the same bump for pnpm (references/holding-a-dependency.md). - Every catalog entry has
^, a prerelease included, except the tilde or exact pin a hold pairs with its rule (references/caret-rules.md). - A release shipped only under another package's name is an
npm:alias onto its dist-tag, moved bypnpm refresh:lockfileand back to a caret range when it reacheslatest(references/dist-tag-aliases.md). - An
overrides:entry is a temporary force of a transitive dependency, removed when upstream catches up (references/overrides.md). oxlint-tsgolintand the vitest pair update normally, each with something a bump watches (references/tracked-issues.md).- A new dependency is the current generation, checked before it enters the catalog — against the
rou3,ufoanddefuthe installedh3,nitroandnuxtuse, and its npm page for a successor;scripts/src/workspace/deprecatedPackages.test.tsandsupersededPackages.test.tsenforce what npm and the superseded map record. - Which manifest lists a dependency, and what removing a library owes, are the
buildskill's (references/dependency-placement.md).
Reference pages
references/bumping-by-hand.md— when taking a bump ahead of Renovate, or the firstpnpmcommand dies inpostinstall.references/major-upgrades.md— when a red row appears inpnpm outdated:dependencies, or Renovate opens a major PR.references/pnpm-bumps.md— whenpackageManagermoves.references/github-actions.md— when bumping an action to a new release.references/updating-node.md— when the node version moves, or a sandbox cannot run the new pin after it did.references/bump-follow-through.md— when any bump lands, before committing it.references/holding-a-dependency.md— when a bump has to be stopped, or a package is listed as held.references/caret-rules.md— when adding, removing or questioning a catalog entry's^,~or exact pin.references/dist-tag-aliases.md— when a release ships only as another package's nightly, or the outdated report labels a row with a tag.references/overrides.md— when adding or removing anoverrides:entry.references/tracked-issues.md— when bumpingoxlint-tsgolint,vitestor@vitest/coverage-v8.references/renovate.md— when editingrenovate.json, or checking why the bot proposed nothing for a dependency.