From qe-framework
Cuts batched releases from CHANGELOG entries, auto-determines bump level, updates version files, commits, tags, and creates a GitHub Release.
How this skill is triggered — by the user, by Claude, or both
Slash command
/qe-framework:Mrelease [major|minor|patch] (omit to infer from CHANGELOG section headers)[major|minor|patch] (omit to infer from CHANGELOG section headers)The summary Claude sees in its skill listing — used to decide when to auto-load this skill
You coordinate a formal release from `CHANGELOG.md` → version files → git tag → GitHub Release.
You coordinate a formal release from CHANGELOG.md → version files → git tag → GitHub Release.
This skill exists because per-commit version bumps cause user-facing churn (plugin cache invalidation, noisy release notifications). Mrelease enforces a release train — accumulate changes in CHANGELOG.md [Unreleased], then cut a deliberate release when the batch is meaningful.
[Unreleased] section in CHANGELOG.md has meaningful entries[Unreleased], not release/Mrelease patch only if the bug is security/data-loss/framework-unusable. Normal edge-case fixes wait for the next scheduled batch.[Unreleased] is empty, abort; there's nothing to releasegit rev-parse --abbrev-ref HEAD → main (never release from a feature branch)git status --short → clean (no uncommitted changes)git fetch && git status → up-to-date with origin (or one ahead is OK — the bump commit)CHANGELOG.md exists and has non-empty [Unreleased] sectionIf any fails: report to user and abort. Do NOT try to fix automatically.
[Unreleased] sectionRead CHANGELOG.md. Find the ## [Unreleased] heading and capture everything until the next ## [ heading.
Collect subsections:
### Added### Changed### Fixed### Removed### SecurityCount entries in each. Empty [Unreleased] → abort with message: "No unreleased changes. Commits should add entries to CHANGELOG.md [Unreleased] before invoking /Mrelease."
If the user passed major, minor, or patch explicitly, use that.
Otherwise infer:
| Rule | → |
|---|---|
Any entry contains [BREAKING] marker OR ### Removed has entries | major |
### Added has entries OR ### Changed has substantive entries | minor |
Only ### Fixed or ### Security entries | patch |
Always confirm with AskUserQuestion before proceeding — present the inferred level + reasoning + the actual changelog content.
Read current version from .claude-plugin/plugin.json.
X.Y.Z → X.Y.(Z+1)X.Y.Z → X.(Y+1).0X.Y.Z → (X+1).0.0## [Unreleased] (excluding the heading itself) to a new section: ## [NEW_VERSION] - YYYY-MM-DD (today's date, ISO format).## [Unreleased] header with the 5 empty subsections at the top.Template for fresh [Unreleased]:
## [Unreleased]
### Added
### Changed
### Fixed
### Removed
### Security
Set the Mbump skill-bypass flag (.qe/state/skill-bypass.json with {active:true, skill:"Mbump", ts:<now>}), then edit:
.claude-plugin/plugin.json — "version" fieldpackage.json — "version" field.claude-plugin/marketplace.json — "version" field inside the qe-framework entry under plugins[] (nested, not top-level). This is the source the marketplace clone reads; skipping it makes the marketplace version drift behind the other two.Find the plugin cache path from ~/.claude/plugins/installed_plugins.json → plugins["qe-framework@inho-team-qe-framework"][0].installPath.
Rsync local repo to cache, excluding .git/:
rsync -a --delete --exclude='.git/' {repo_root}/ {cache_install_path}/
Update installed_plugins.json — set version to new version and gitCommitSha to null (will be updated post-commit in step 7).
Delegate to Ecommit-executor agent. Message: chore: release v{NEW_VERSION}
Files staged: CHANGELOG.md, .claude-plugin/plugin.json, package.json, .claude-plugin/marketplace.json.
After commit, update installed_plugins.json with the actual commit SHA.
git tag -a v{NEW_VERSION} -m "{one-line summary extracted from CHANGELOG section}" {commit_sha}
Tag message: first non-empty line of the new version's CHANGELOG section, or Release v{NEW_VERSION} if no clear summary.
Q1 — Push?
main + v{NEW_VERSION} tag to originQ2 — GitHub Release? (only if push was selected)
gh release create v{NEW_VERSION} --notes-file <temp file with CHANGELOG section>## Released v{NEW_VERSION}
- CHANGELOG section: {entry count summary}
- Commit: {sha}
- Tag: v{NEW_VERSION}
- Pushed: yes|no
- GitHub Release: created|skipped
- Plugin cache: synced — restart Claude Code to load new version
Report output language matches the user's input language. CHANGELOG itself stays English (international convention).
main branch[Unreleased]major without confirmation (always ask)Ecommit-executor for the bump commit (direct git commit is blocked; the bypass is only for plugin.json/package.json edits)npx claudepluginhub inho-team/qe-framework --plugin qe-frameworkCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.