azure/node-migration
Migrate Azure/azure-sdk-for-js to a user-specified minimum Node.js version while preserving any existing references above the target.
npx skills add https://github.com/Azure/azure-sdk-for-js --skill node-migration
Migrate the Azure SDK for JavaScript (Azure/azure-sdk-for-js) to a user-specified minimum Node.js version.
Use this skill when the user asks to upgrade, migrate, or raise the repo-wide Node.js minimum or supported version for Azure/azure-sdk-for-js.
The user must provide a target Node.js version.
Define these values before editing:
| Name | Meaning |
| --- | --- |
| TARGET_MAJOR | User-requested target major, for example 22 or 24. |
| TARGET_SEMVER_MIN | Minimum engine form matching nearby style, usually >=${TARGET_MAJOR} or >=${TARGET_MAJOR}.0.0. |
| OLD_SUPPORTED_MAJORS | Node majors below TARGET_MAJOR that appear in Node-runtime contexts. |
| HIGHER_MAJORS | Node majors above TARGET_MAJOR that appear in Node-runtime contexts and must be preserved. |
TARGET_MAJOR to TARGET_MAJOR.TARGET_MAJOR. For example, when target is 22, preserve 24; when target is 24, preserve 26.For future migrations, do both passes: broad mechanical sweep first, then a missed-reference sweep.
Azure/azure-sdk-for-js. If not, stop and tell the user this skill expects that repo.TARGET_MAJOR and keep them unchanged unless the user explicitly says otherwise.Target areas to search:
| Area | Paths / Patterns |
| --- | --- |
| Package engines | **/package.json files containing "node" in engines. |
| Workspace catalog | pnpm-workspace.yaml — check catalog: entries for @types/node. |
| Direct Node setup pins | .nvmrc, .node-version, .github/workflows/, eng/pipelines/, rush.json, common/config/rush/**. |
| Dev tooling | common/tools/dev-tool/, common/tools/eslint-plugin-azure-sdk/, eng/tools/, eng/containers/. |
| Docs and Docker | documentation/, README.md, sdk//Dockerfile, eng/**/Dockerfile. |
| CI and build scripts | /.github/workflows/, /eng/pipelines/, /eng/scripts/. |
| Review guidelines | .github/instructions/, .github/prompts/ — these may reference Node minimum versions as policy. |
| SDK packages (bulk) | All sdk//package.json engine fields and sdk//samples/**/package.json @types/node entries. These are enforced by the eslint rule and dev-tool, so update them in bulk after updating the tooling constants. |
| Textual leftovers | For each old major X: Node.js X, Node X, node-version: "X", node-version: X, NODE_VERSION=X, >=X, >=X.0.0, @types/node@X, @types/node": "X, @types/node": "^X, and known LTS codenames if relevant. |
TARGET_MAJOR conflicts with the upper bound, ask the user how to handle it.@types/node only when it represents the repo's supported Node typings for tooling or packages. Do not downgrade higher-major typings.TARGET_MAJOR, but preserve entries above TARGET_MAJOR..nvmrc or .node-version, prefer the repo's existing convention. If the correct LTS codename is uncertain, use the numeric target major rather than guessing.Use repo-defined commands only. Inspect package.json, rush.json, and repo docs before choosing commands.
Recommended validation:
TARGET_MAJOR.TARGET_MAJOR and confirm they were not downgraded.For every remaining old-major hit, classify it as one of:
| Classification | Meaning |
| --- | --- |
| Changed | The reference was updated to TARGET_MAJOR. |
| Intentionally preserved: not Node | The number is not a Node.js runtime/minimum reference. |
| Intentionally preserved: above target | The version is above TARGET_MAJOR and must remain unchanged. |
| Needs user decision | The reference is ambiguous or the target conflicts with an upper bound. |
TARGET_MAJOR, stop and ask the user whether to raise the upper bound, skip that package, or handle it separately..nvmrc uses an LTS codename and the correct codename is uncertain, prefer the numeric target major instead of guessing.Take azure/node-migration from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.