microsoft/hotfix
Proposes a scoped version bump for a roosterjs hotfix. Given one or more commits provided by the user, determines which packages had files changed by those commits, bumps the version only for the affected version groups, and creates a draft PR. Use when asked to do a hotfix, a scoped/targeted version bump, or to release only specific commits.
npx skills add https://github.com/microsoft/roosterjs --skill hotfix
This skill performs a scoped version bump for a roosterjs hotfix. Unlike the full version-bump skill (which bumps everything merged into master since the last release), this skill bumps the version only for the packages whose files were changed by the specific commits the user provides.
The user supplies the commits to hotfix. Each changed file is mapped to its package, each package to a version group (main, legacyAdapter, react), and only the affected groups are bumped.
The user must provide the commits to include in the hotfix. Accept any of:
5142b51 e593ee8)abc123..def456)gh pr view <number> --json mergeCommit)If the user does not provide any commits, stop and ask which commits should be included in the hotfix before doing anything else.
The version groups live in versions.json and map to package sets defined in tools/buildTools/common.js (buildConfig). Use this mapping to translate changed files → group:
| Group | Packages |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| main | roosterjs, roosterjs-content-model-types, roosterjs-content-model-dom, roosterjs-content-model-core, roosterjs-content-model-api, roosterjs-content-model-plugins, roosterjs-color-utils, roosterjs-content-model-markdown |
| legacyAdapter | roosterjs-editor-adapter |
| react | roosterjs-react |
Notes:
packages/<package-name>/ identifies the package; look up which group lists that package.roosterjs-editor-*, except roosterjs-editor-adapter) are not in versions.json and are not versioned by this skill. If a commit only touches legacy packages or non-package files (e.g. tools/, demo/, root configs), see Step 4.tools/buildTools/common.js in case packages were added or moved.Confirm the commits the user provided (see Inputs). If none were provided, stop and ask. Resolve PR numbers to commit hashes if needed. Verify each commit exists:
git cat-file -t <commit>
If any commit is invalid/unknown, stop and report it.
Only tracked modifications (staged or unstaged edits to files git knows about) interfere with switching branches and cherry-picking. Untracked files (e.g. a new, not-yet-added skill folder or scratch files) do not interfere — do not block on them.
Check for blocking (tracked) changes only:
git status --porcelain --untracked-files=no
git status --porcelain (with untracked) shows untracked files, mention them in one line and continue — they will be carried along untouched and excluded from the bump commit (which stages only versions.json). Note that gh pr create may print a harmless "uncommitted change" warning because of them.The hotfix branch is based on release (that is what ships).
git checkout release
git pull origin release
If either command fails, stop and report the error.
Then check whether each provided commit is already on release — this is the common hotfix situation: the fix lives on master and must be cherry-picked onto release. Do not assume the commit is already there.
git merge-base --is-ancestor <commit> release && echo "on release" || echo "NOT on release"
release directly).AskUserQuestion covering cherry-pick + bump level works well).For each provided commit, list the files it changed. Combine across all commits (deduplicate):
git show --name-only --pretty=format: <commit>
For a range, use:
git diff --name-only <from>..<to>
Collect the full set of changed file paths.
Map files to groups:
packages/<package-name>/..., record <package-name>.tools/buildTools/common.js).Handle edge cases:
tools/, demo/, root configs, docs, etc.), stop and tell the user: "The provided commits do not change any versioned package files, so no version bump is needed." List the changed files so they can confirm.roosterjs-editor-* other than roosterjs-editor-adapter), tell the user those packages are not versioned via versions.json and ask how they want to proceed.Show the user a summary before continuing:
Affected packages and groups:
- roosterjs-content-model-plugins → main
- roosterjs-react → react
Affected groups to bump: main, react
Create a new branch from release. Use the naming convention u/<username>/hotfix-<N>, picking the next free N (check existing branches so you don't collide), or a name the user specifies:
git branch --list 'u/<username>/hotfix-*' # see which N are taken
git checkout -b <branch_name> release
For each commit identified in Step 3 as not on release (in the order the user provided), cherry-pick it onto the new branch:
git cherry-pick <commit>
git cherry-pick --abort).A hotfix is normally a patch bump (bug fixes, no public API changes). Determine the bump per affected group:
To check whether more than a patch is warranted, inspect the commits' changes to each affected package's lib/index.ts barrel files and exported types/interfaces:
git show <commit> -- 'packages/**/lib/index.ts'
If a minor or major bump appears needed, show the interface differences to the user and ask whether they want that bump or to keep it a patch. A hotfix is usually intended to stay a patch — confirm before doing anything larger.
Only bump the groups identified in Step 4. Leave all other groups untouched.
Read the current versions from versions.json and apply the bump computed in Step 6 to only the affected groups. Do not change groups that were not affected.
yarn build
yarn test:fast
If any errors occur, show the full error output and stop the flow. Do not proceed with a broken build.
git add versions.json
git commit -m "Hotfix version bump <group>: <old_version> → <new_version>"
List all changed groups/versions in the commit message.
git push origin <branch_name>
Create a draft PR targeting the release branch:
Title: Hotfix version bump <group>: <old_version> → <new_version> (list all affected groups)
Description: Include:
| Group | Old Version | New Version |
| ----- | ----------- | ----------- |
| main | x.y.z | x.y.z+1 |
| react | x.y.z | x.y.z+1 |
## Hotfix commits
- <short_hash> <commit_subject>
## Affected packages
- roosterjs-content-model-plugins → main
- roosterjs-react → react
Command:
gh pr create --draft --base release --title "<title>" --body "<description>"
✅ Hotfix version bump PR created successfully!
PR: https://github.com/microsoft/roosterjs/pull/<number>
Affected groups: <list>
Take microsoft/hotfix 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.