From ct
Detects the package ecosystem, stages dependency updates by patch/minor/major, regenerates lockfiles, runs tests, and summarizes breaking changes. Safety-oriented: no commits, no global installs.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ct:dependency-bumpopusThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Staged, reviewable dependency upgrades for the detected ecosystem. Patches and minors by default; majors require explicit user sign-off after a changelog review.
Staged, reviewable dependency upgrades for the detected ecosystem. Patches and minors by default; majors require explicit user sign-off after a changelog review.
The value of this skill is staging. Bundling every update into one commit hides which bump broke what. Separating patch → minor → major and running tests between stages makes regressions attributable.
npm install -g, pip install --user, cargo install, etc.).DETECT → Identify ecosystem from manifest files
PARSE → Bucket updates into patch / minor / major
REVIEW → Fetch changelogs for major bumps
PROPOSE → Present staged plan for user approval
EXECUTE → Apply approved stages, regenerate lockfile, run tests
REPORT → Summarise bumped packages + breaking-change notes
Understand the project's package management BEFORE running any command. Do NOT assume from filename patterns alone — inspect the project's own canonical setup signals, then record the finding for reuse.
One ecosystem per invocation. Mixed-language repos run the skill once per ecosystem.
Steps:
Enumerate dependency-manifest and lockfile candidates in the project root:
ls -la # look for anything that declares or locks dependencies
Typical manifests span many ecosystems — package.json, Cargo.toml, go.mod, pyproject.toml, Gemfile, pom.xml, build.sbt, build.gradle*, lakefile.toml / lakefile.lean, mix.exs, stack.yaml, *.cabal, Pipfile, flake.nix, shard.yml, deps.edn, elm.json, dune-project, gleam.toml, zig.zon, opam, BUILD.bazel, etc. This list is illustrative — do not treat it as exhaustive, and do not fall back to "no ecosystem" just because the manifest isn't on it.
Find the PROJECT'S canonical install / update / test commands. In priority order:
.github/workflows/*.yml, .gitlab-ci.yml, .circleci/config.yml, Jenkinsfile, .buildkite/*.yml, azure-pipelines.yml). CI is authoritative — it records exactly how the project is built, installed, and tested in a clean environment.## Dependency Commands section — may already exist if this skill ran before; use it directly.Record the finding. You need at minimum: manifest file(s), lockfile (if any), outdated query, audit query (or "n/a"), update command, test command. If the project uses a well-known ecosystem AND the CI/README confirms the standard commands, use the standard commands (reference table below). If anything is ambiguous or exotic, ASK the user rather than guess.
Persist the finding for reuse — append or update ## Dependency Commands in the project's CLAUDE.md so the next invocation skips discovery:
## Dependency Commands
- Manifest: <file>
- Lockfile: <file or "none">
- Outdated: <command>
- Audit: <command or "n/a">
- Update: <command pattern, per-package or bulk>
- Test: <command>
Run the outdated + audit commands. If a helper tool (cargo-outdated, cargo-audit, pip-audit, govulncheck, similar) is listed as recommended but not installed, note its absence in the final report. Do NOT install helper tools.
Non-authoritative hint sheet for well-known ecosystems. When a project's CI / README confirms one of these setups, reuse the listed commands. For anything exotic (Lean 4, Gleam, Zig, Elm, Scala, Nim, OCaml, Clojure, Elixir, Haskell, Crystal, Lua/Rockspec, etc.) or customised, skip this table and use what you found in step 2.
| Ecosystem | Manifest + lockfile | Outdated | Audit |
|---|---|---|---|
| pnpm | package.json + pnpm-lock.yaml | pnpm outdated --format json | pnpm audit --json |
| yarn | package.json + yarn.lock | yarn outdated --json | yarn npm audit --json |
| npm | package.json + package-lock.json | npm outdated --json | npm audit --json |
| cargo | Cargo.toml + Cargo.lock | cargo outdated --format json (or cargo update --dry-run) | cargo audit --json (if installed) |
| uv | pyproject.toml + uv.lock | uv lock --upgrade --check | n/a |
| poetry | pyproject.toml + poetry.lock | poetry show --outdated | n/a |
| pip | requirements*.txt or pyproject.toml | pip list --outdated --format json | pip-audit --format json (if installed) |
| go modules | go.mod | go list -u -m -json all | govulncheck ./... (if installed) |
From the outdated output, produce three explicit lists using semver-style bump classification:
x.y.Z bumps only (third component changes). Low risk; bundle.x.Y.z bumps (second component changes). Usually safe.X.y.z bumps (first component changes). Needs review.For ecosystems without strict semver (e.g. Go modules using v0.x where every minor is effectively a major), treat v0.x.y → v0.X.z as major and say so in the report.
Preserve current-version and latest-version numbers for each package — they appear in the final report.
For each major bump, WebFetch the package's changelog. Source priority:
https://github.com/<org>/<repo>/releases/tag/v<new>).npmjs.com for Node packages.Summarise breaking changes in ≤3 bullets per package. Quote specific removed APIs / changed signatures where named. If the changelog does not enumerate breaking changes explicitly, say so: "Changelog does not list breaking changes — review manually."
Do NOT auto-include majors in the executed bump plan. They require user sign-off in Phase 4.
If WebFetch fails for a package, record "changelog unreachable — review manually" and continue. Do not block on a single fetch failure.
Present to the user exactly this shape:
Stage 1 — Patch (N packages): pkg-a 1.2.3→1.2.4, pkg-b 4.5.6→4.5.8
Risk: low. Bundle.
Stage 2 — Minor (N packages): pkg-c 2.1.0→2.3.0
Risk: usually safe.
Stage 3 — Major (N packages, needs review):
- pkg-d 3.0.0→4.0.0
Breaking changes (from changelog):
- <bullet>
- <bullet>
- pkg-e 1.0.0→2.0.0
Breaking changes: <...>
Risk: requires review.
Which stages do you want executed? Default: Stage 1 only.
Wait for user response. STOP until user replies with the stage selection (e.g. "stage 1 and 2", "all three", "skip stage 3").
For each approved stage, in order (1, then 2, then 3):
Run the ecosystem's update command. Source priority:
Update command you recorded in CLAUDE.md ## Dependency Commands (Phase 1 step 4) — this is authoritative.Common patterns for recognised ecosystems (reference only — defer to the project's documented command):
| Ecosystem | Update pattern |
|---|---|
| pnpm | pnpm update <pkg>@<version> ... |
| yarn | yarn up <pkg>@<version> ... |
| npm | npm install <pkg>@<version> ... |
| cargo | cargo update -p <pkg> --precise <version> per package |
| uv | uv lock --upgrade-package <pkg> per package |
| poetry | poetry update <pkg> per package |
| pip (requirements.txt) | edit pinned version in requirements.txt, then pip install -r requirements.txt |
| go modules | go get <module>@<version> per package, then go mod tidy |
For exotic or customised ecosystems, use exactly what the project's CI config / Makefile / README prescribes. If you cannot determine the update command, STOP and ask the user.
Confirm the lockfile (if any) regenerated. Never hand-edit lockfiles. Never bypass lockfile regeneration.
Run the project's test command. Detection order (first match wins):
## Test Command section.Test entry from ## Dependency Commands (recorded in Phase 1 step 4).<pm> test, pytest, cargo test, go test ./...).Record the stage's test outcome: PASS / FAIL / SKIPPED-no-tests.
HARD GATE — stage failure:
→ Tests fail after any stage → STOP. Do NOT proceed to the next stage. Report the failure, show the diff, let the user decide.
Produce the final summary. Bounded to 600 words.
## Dependency Bump — <ecosystem>
### Bumped (Stage 1 — Patch, tests: PASS)
- pkg-a 1.2.3 → 1.2.4
- pkg-b 4.5.6 → 4.5.8
### Bumped (Stage 2 — Minor, tests: PASS)
- pkg-c 2.1.0 → 2.3.0
### Bumped (Stage 3 — Major, tests: PASS)
- pkg-d 3.0.0 → 4.0.0
Breaking changes:
- <bullet>
- <bullet>
- <bullet>
### Skipped
- pkg-x 1.0.0 → 2.0.0 — user declined major upgrade.
### Audit findings
- <vuln summary from audit command, or "audit tool unavailable">
### Next step
Review the diff. Commit when satisfied. This skill does NOT commit.
Major-bump changelog summaries: ≤3 bullets each, verbatim from Phase 3.
| Thought | Reality |
|---|---|
| "I'll bundle all updates into one commit" | Staging is the whole point. Separate patch / minor / major. |
| "The major bump is probably fine" | Fetch the changelog. Always. |
| "Tests failed but it's probably flaky" | STOP. Report. Do not proceed. |
| "I'll update Node from 18 to 20 while I'm here" | Out of scope. Refuse. |
"I'll install cargo-audit since it's missing" | No global installs. Note absence in the report. |
npx claudepluginhub pvillega/claude-templates --plugin ctEnforces a structured process for updating, migrating, and auditing project dependencies with incremental verification. Handles security vulnerabilities, breaking changes, and major version upgrades.
Scans projects for outdated npm/pip/Cargo/Go/Ruby packages. Runs CVE audit, fetches changelogs, summarizes breaking changes with Gemini, and opens one PR per risk group (patch/minor/major).
Scans JS, Python, Go, Rust, Java package files for outdated dependencies, summarizes changelogs, detects breaking changes and vulnerabilities, generates prioritized update reports.