用途
Absolute Upgrade 用于把项目的依赖更新到较新版本,强调「安全、按风险排序、逐波推进、每波之后测试保持通过」。它不是盲目执行 npm update:过期和有漏洞的依赖会按影响范围(blast radius)分组——patch/minor 进入安全波次,major/破坏性变更单独门控、一次一个、先读 changelog——然后增量应用,并用项目自身的测试套件验证。
何时使用
- 日常「把依赖更新到最新」/「升级我们的依赖」。
- 指定某个升级:「把 React 升到 19」「从已弃用的 X 包迁移出去」。
- 清理 npm outdated / Dependabot 积压,而不必开 40 个独立 PR。
不适用:新增依赖(那是工作/功能决策);专门审计漏洞 → 使用 /absolute audit(它做 CVE 分诊,upgrade 负责移动版本号)。
共享引擎
该技能运行 references/health-engine.md 中的共享引擎——其中定义了 DETECT → SCAN → TRIAGE → FIX → VERIFY → REPORT 循环与安全契约。本文件只覆盖依赖升级特有的部分。
扫描内容
按生态列出过期依赖及其 current → wanted → latest 与跳变类型:
| 生态 | 检测过期的命令 | 锁文件 / 清单文件 |
|---|---|---|
| npm | npm outdated --json | package-lock.json |
| pnpm | pnpm outdated --format json | pnpm-lock.yaml |
| yarn | yarn outdated --json | yarn.lock |
| Python (pip) | pip list --outdated --format=json | requirements*.txt |
| Python (poetry/uv) | poetry show --outdated / uv pip list --outdated | pyproject.toml + lock |
| Go | go list -u -m -json all | go.mod / go.sum |
同时标记:存在已知弃用的依赖、同一包的重复/多版本、直接依赖与传递依赖(只有直接依赖是升级目标,传递依赖随之变化)。
风险分级(TRIAGE)
按 semver 跳变把升级计划分成波次,最安全的优先:
| 波次 | 跳变 | 默认处理 |
|---|---|---|
| 1 | patch (x.y.Z) | 合并批量,立即修复 |
| 2 | minor (x.Y.z) | 按包族合并,立即修复 |
| 3 | major (X.y.z) / pre-1.0 minor | 一次一个,门控——先读 changelog/迁移指南,列出破坏性变更 |
对每个 major 升级:定位破坏性变更(CHANGELOG、release notes、包自带 codemod 时使用 codemod),清点触及变更 API 的调用点,并在应用前说明迁移方式。peer-dependency 冲突与其驱动包在同一波次内解决。
修复与验证
- 应用一个波次,重新生成锁文件,运行项目完整的测试 + 构建(安装通过并不等于升级通过)。
- major:版本跳变与所需的代码迁移必须在同一波次内完成,否则构建会失败。包提供 codemod 时使用 codemod。
- 某个波次无法在合理范围内变绿 → 回滚它,报告为 blocked 并附上错误,保留已绿的波次。绝不用 --force / --legacy-peer-deps 掩盖真实冲突。
注意事项
- 只改锁文件的「升级」:只改清单而不重新生成并提交锁文件,会发布未经测试的传递版本。始终重新生成。
- 把 major 混进 patch 批次:一个破坏性跳变会让整波失败,并掩盖是哪个变更导致的。major 永远单独处理。
- 安装变绿 ≠ 项目变绿:npm install 成功不能证明任何事——要跑测试。
- 围绕失败做固定(pin):如果某个升级破坏功能,就修复或推迟;不要为了绕过而默默把依赖树固定住。
配套命令
- /absolute audit —— 如果目标是修复漏洞,从那里开始;它会为版本移动回到这里。
- /absolute deflake —— flaky 测试可能掩盖升级是否真正通过。
- /absolute work —— 如果升级需要真正的功能级迁移工作,交给它。