release
Create a release proposal for the v5.x branch by cherry-picking commits from main
Source facts
- Repository
- datadog/pprof-nodejs
- Last source activity
- August 11, 2026 at 11:55
- Detected SKILL.md language
- English
- Stars
- 31
- Forks
- 8
Install options
The review-first prompt is selected by default. You can switch to a direct command or download a local copy.
Review the source files
Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.
Showing SKILL.md
SKILL.md
Source instructions ยท Read-only preview- name
- release
- description
- Create a release proposal for the v5.x branch by cherry-picking commits from main
- disable-model-invocation
- true
- argument-hint
- [version (optional, auto-determined from PR labels)]
Create a v5.x release proposal. If a version is provided as $ARGUMENTS, use it. Otherwise, determine it automatically (see step 2).
## Prerequisites
The `branch-diff` tool must be installed globally:
```
npm install branch-diff -g
```
Fetch and fast-forward **both** branches before doing anything else. Comparing a
stale `v5.x` against a stale `main` silently produces a wrong commit list:
```
git fetch origin && git checkout v5.x && git pull && git checkout main && git pull
```
## Steps
### 1. Identify commits to cherry-pick
Use the `branch-diff` tool to list commits on `main` not yet applied to `v5.x`:
```
branch-diff v5.x main
```
Its GitHub issue-lookup errors go to stderr; the commit list is on stdout. PR numbers
appear in the trailing URL (`.../pull/393`), *not* as `(#393)` โ parsing the `(#NNN)`
form instead picks up PR references that happen to appear in commit titles.
`branch-diff` matches commits, not content, so it reports a substantial number of
**false positives** โ commits whose changes are already on `v5.x`. Do not cherry-pick
these. They fall into three classes:
**a. Squash-merged releases.** Releases 5.14.2, 5.14.3 and 5.14.4 were squash-merged
rather than rebased, so every commit they contained lost its identity and is reported
forever. This set is closed and will not grow โ treat all of these as already released:
| Release | Proposal | PRs subsumed |
|---|---|---|
| 5.14.2 | #331 | 284, 310, 311, 315, 316, 317, 320, 323, 324, 325, 326, 327, 329 |
| 5.14.3 | #334 | 328, 332 |
| 5.14.4 | #337 | 333, 335, 336 |
**b. Superseded dependency bumps.** A Dependabot bump that never landed on `v5.x`, which
later picked up an equal-or-newer version of the same package directly. Cherry-picking one
would *downgrade* the branch. Recognise these by comparing the package version in
`v5.x:package.json` against the bump's target โ skip when `v5.x` is at or ahead of it.
(Examples seen so far: #140, #344, #348, #349, #350.)
**c. The `main`-only version bump.** #154 moved `main` to `6.0.0-pre`. It must never be
cherry-picked onto a 5.x release branch.
Anything left after removing those three classes is a genuine candidate. Note that being
old is *not* by itself evidence of a false positive: #352 sat below all of these and was a
real, unapplied commit. Classify by the rules above, not by age.
Confirm the list of commits with the user before proceeding.
### 2. Determine the version number
If the user didn't provide a version, determine it from PR labels. For each commit being cherry-picked, extract the PR number from the commit message (e.g. `(#305)`) and check its labels:
```
gh pr view <number> --json labels --jq '.labels[].name'
```
- If any PR has a `semver-minor` label, the release is a **minor** bump.
- If all PRs have at most a `semver-patch` label, the release is a **patch** bump.
Get the current version from the tip of `v5.x` (the most recent version commit message), then compute the next version accordingly. Confirm the version with the user.
In the steps below, `$VERSION` refers to the determined version number.
### 3. Create a worktree
Create a git worktree from the current repo, checking out a new branch `v$VERSION-proposal` based on the `v5.x` branch:
```
git worktree add ../pprof-nodejs-v5 -b v$VERSION-proposal v5.x
```
The path is usually still occupied by the previous release's worktree. Once that
proposal's PR is merged, it is safe to clear โ verify it is clean and merged first, then:
```
git worktree remove ../pprof-nodejs-v5 && git branch -D v<previous>-proposal
```
All subsequent steps run in the worktree directory.
### 4. Cherry-pick commits
Cherry-pick the agreed-upon commits in chronological order (oldest first):
```
git cherry-pick <hash1> <hash2> ...
```
If a cherry-pick has conflicts, stop and resolve with the user.
### 5. Verify the selection against `main`
Before bumping the version, diff the worktree against `main`:
```
git diff --stat main -- .
```
The goal is **minimal divergence**: ideally this reports nothing but `package.json` and
`package-lock.json` (the version, plus any dev-dep bump this release includes).
This is the check that validates step 1, and it is worth doing carefully โ it is how #352
was caught, a genuinely unapplied commit that a plausible-looking age heuristic had
written off as a false positive. Any *other* file appearing here means one of two things:
- a real commit was wrongly classified as a false positive โ cherry-pick it, or
- the divergence is deliberate โ say so explicitly in the PR body rather than leaving it
silently unexplained.
Note that a class-(b) superseded bump correctly shows up as a `package.json` /
`package-lock.json` difference where `v5.x` is *ahead* of `main`. That is expected and
should be left alone.
### 6. Create the version bump commit
Bump the version in package.json and package-lock.json using npm, then commit:
```
npm version $VERSION --no-git-tag-version
git add package.json package-lock.json
git commit -m "v$VERSION"
```
Keep this commit last on the branch. If a further cherry-pick turns out to be needed after
this point, drop the version commit (`git reset --hard HEAD~1`), apply the cherry-pick,
then re-run the bump โ rather than stacking the new commit on top of the release commit.
### 7. Push and create a PR
Push the branch and create a PR targeting `v5.x`:
```
git push -u origin v$VERSION-proposal
```
Create the PR with `gh pr create --base v5.x`. The PR body should categorize the cherry-picked PRs by type, following this pattern:
```markdown
# New features
* #NNN
# Improvements
* #NNN
# Bug fixes
* #NNN
# Other (build, dev)
* #NNN
```
Only include sections that have entries. Reference PR numbers from the original commit messages.
See https://github.com/DataDog/pprof-nodejs/pull/295 for an example.
View on GitHub