Safely plan and execute dependency maintenance for JavaScript/TypeScript (npm, pnpm) and GitHub Actions, including npm lockfiles, pnpm workspaces, catalogs, overrides, SHA-pinned action versions, release-age policies, audits, CI validation, Dependabot boundaries, PRs, and GitHub tracking issues. Use whenever the user asks to update, bump, refresh, audit, clean, modernize, or review dependencies or GitHub Actions, reduce vulnerabilities, clean overrides, or prepare dependency PRs/issues.
78
88%
Does it follow best practices?
Impact
90%
1.45xAverage score across 1 eval scenario
Passed
No findings from the security scan
Use this workflow to maximize safe dependency progress without changing the repository's package-manager contract or hiding remaining risk.
AGENTS.md, CLAUDE.md, package-specific instructions, and CONTRIBUTING.md.packageManager, CI, deploy config, and package-manager guard
scripts:
package-lock.json, and validate with npm ci.pnpm-lock.yaml, pnpm-workspace.yaml, catalogs, and overrides.git status --short --branch. If unrelated changes are present, use an isolated
worktree or avoid touching those files..nvmrc, .node-version, engines, .npmrc, deploy config, dependabot.yml, and the GitHub Actions pins in
.github/workflows/*.yml and .github/actions/**/action.yml.minimumReleaseAge is a maturity window in minutes. Treat the configured minimumReleaseAgeExclude
list as read-only: respect the existing entries, but never add or widen it to push a fresher version through — the
maturity window is a hard gate, not a hurdle to bypass.github-actions PRs: its cooldown in dependabot.yml (7 days) matches the action maturity window, so leave
that job enabled and let the two coexist. Docker and other non-JavaScript ecosystems also stay under Dependabot.@v4, @main). A movable ref lets
the upstream repo change what runs in CI without review. Append the human-readable version as an end-of-line comment
(uses: actions/checkout@<sha> # v7.0.0) and update that comment on every bump so the SHA stays auditable.dependencies/devDependencies specifier must be an exact pin, never
a ^ caret or ~ tilde range. Floating ranges silently pull unreviewed releases and widen the supply-chain attack
surface, so a single exact version is the only safe and reproducible default. When a bump touches a manifest, also
tighten any pre-existing ^/~ range on that package to an exact pin. The exception is peerDependencies: those
declare the version range a consumer must satisfy (the package never installs them itself), so pinning them exact
invents false incompatibilities — leave intentional peer ranges as ranges.catalog: references, workspace: references, and repo-specific package
placement unchanged. Pin the concrete version at the catalog definition so consumers stay on catalog:.Build an inventory from direct dependencies, dev dependencies, peer dependencies, optional dependencies, catalogs, overrides, lockfiles, and audit output.
Use native commands first:
npm outdated --json || true
npm audit --json || true
npm explain <package>
npm ls <package>
pnpm outdated -r --format json || true
pnpm audit --json || true
pnpm why <package> -rWhen registry-age gates matter, use the bundled helper as a reproducible first pass:
node <skill-dir>/scripts/eligible-updates --manager auto --days 3Replace <skill-dir> with the directory containing this SKILL.md. Adjust --days or --minutes to match the repo
policy.
Classify every candidate before changing files:
Group tightly coupled packages together when separate bumps are likely to create peer, type, or runtime friction.
catalog:.package.json and regenerate package-lock.json with npm. Prefer lockfile-only install when
appropriate, then validate with clean install.pnpm-lock.yaml with normal pnpm install flow. Do not bypass minimumReleaseAge.engine-strict, ignore-scripts, LavaMoat allow-scripts, and
only-allow.Treat overrides as temporary exceptions:
Refresh overrides after the direct bumps land, so you only keep exceptions that are still required. Let natural resolution catch up first, then keep overrides only for advisories that remain. The flow is the same regardless of package manager, but the exact commands differ, so use the ones in the matching reference file:
overrides in pnpm-workspace.yaml, pnpm.overrides in package.json, or resolutions.
For npm, use overrides in package.json. Do not edit generated lockfile override metadata by hand.npm audit fix without --force, which stays non-major. For
pnpm, run pnpm audit --fix; on pnpm 10 this can write targeted overrides pinning the patched versions, while older
pnpm versions may require adding targeted exact overrides manually from the remaining audit output. If pnpm edits
minimumReleaseAge, minimumReleaseAgeExclude, or related maturity-gate settings, revert those edits immediately; do
not use audit fix to bypass the maturity gate.Then inspect the result — do not trust the audit fix blindly:
references/pnpm.md).minimumReleaseAge also gates overrides: pnpm refuses an exact-version override still inside the
maturity window and can silently fall back to an older in-range version that is still vulnerable. Confirm with
pnpm why <pkg> -r plus a re-audit that the intended patched version actually landed. If the only patched version is
still inside the maturity window, treat the advisory as blocked and track it until the version matures — never widen
minimumReleaseAgeExclude to force it in. If pnpm audit --fix adds such an exclusion, revert it; do not accept the
silent, still-vulnerable fallback or compensate for maturity failures with config changes.See references/pnpm.md and references/npm.md for the per-manager commands (on pnpm 10 pnpm audit --fix rewrites
overrides automatically; npm never writes overrides, so its flow relies on npm audit fix without --force plus
manual targeted overrides).
Workflow and composite-action files (.github/workflows/*.yml, .github/actions/**/action.yml) reference third-party
actions. Maintain them on the same lifecycle as packages: inventory, triage by release age, bump, validate.
Inventory the pins with a reproducible first pass:
node <skill-dir>/scripts/eligible-actions --days 7The helper scans every external uses: pin and, for each action, reports the newest same-major release older than the
cutoff plus its exact commit SHA. It needs an authenticated gh CLI. The action gate is 7 days; adjust
--days/--minutes only if repo policy differs. When the same action is pinned to different SHAs across files, the
report sets conflictingPins and lists each variant — reconcile those before bumping.
Triage each pin:
conflictingPins is true (different SHAs for the same action path). Align every workflow file to one SHA
and comment before applying any bump suggestion.commentDrift is true (same SHA but different version comments). Align comments before bumping.Apply a bump by replacing the SHA and the trailing comment together, so they never drift:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3Local actions (uses: ./.github/actions/...) are first-party and need no pin. See references/github-actions.md for the
exact gh commands to resolve a tag to its commit SHA and confirm its release age.
Run the narrowest meaningful checks first, then broaden by blast radius:
uses: is a 40-character commit SHA with a matching version
comment, and that each bumped release cleared the age gateIf a command cannot run, report why. If CI fails, inspect the actual logs and classify the failure as introduced by the update, exposed baseline debt, or external/non-actionable.
Open the PR only after local validation is green. Opening a PR is an outward-facing action, so commit the work on a dedicated branch, then pause and confirm with the user before pushing and creating the PR.
deps(global): refresh dependencies)..github/workflows/*.yml and .github/actions/**/action.yml changes together. Use
deps(actions): refresh GitHub Actions to align with Dependabot's github-actions commit prefix.Open English follow-up issues for deferred major upgrades or blocked migration streams. Each issue should include official docs, current and target versions, expected code areas, migration plan, validation, rollout risk, and rollback notes.
Pause before contract deployments, public API breakage, package-manager migration, broad refactors, invalid override trees, or CI failures that suggest a cross-cutting regression.
references/npm.md.references/pnpm.md.references/github-actions.md.scripts/eligible-updates (npm/pnpm) or scripts/eligible-actions
(GitHub Actions).24fa37a
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.